Der ffmpeg-Befehl, den Sie benötigen, sieht so aus:
ffmpeg -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -an -pass 1 output.bar; ffmpeg -y -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -b:a $audiobitrate -pass 2 output.bar
libx264 ist der h264-Encoder, und alle Optionen werden von ffmpeg an ihn übergeben, sie sind ziemlich selbsterklärend. Der erste Durchlauf benötigt kein Audio, daher die -an. Sie können die Ausgabe an / dev / null weiterleiten, wenn Sie möchten. Ich verwende einfach die Option -y im zweiten Durchlauf, sodass die temporäre Datei ohne Rückfrage überschrieben wird. Der Audio-Codec ist standardmäßig aac, sodass Sie ihn nicht angeben müssen.
ffprobe kann Ihnen helfen, den Wert von $ videobitrate und $ audiobitrate zu erhalten (ich gehe von einer posix-Umgebung aus, andernfalls wird es% videobitrate% und% audiobitrate% sein). Sie müssen etwas sed, awk oder perl voodoo machen, um die Werte in eine Form zu bringen, die Sie verwenden können. Hier ist die Ausgabe von ffprobe auf einem zufälligen mp4 auf meinem Rechner:
ffprobe version 2.1.3 Copyright (c) 2007-2013 the FFmpeg developers built on Feb 12 2014 22:10:38 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-openssl --enable-libopus --enable-frei0r --enable-libcaca --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 ' libavutil 52. 48.101 / 52. 48.101 libavcodec 55. 39.101 / 55. 39.101 libavformat 55. 19.104 / 55. 19.104 libavdevice 55. 5.100 / 55. 5.100 libavfilter 3. 90.100 / 3. 90.100 libavresample 1. 1. 0 / 1. 1. 0 libswscale 2. 5.101 / 2. 5.101 libswresample 0. 17.104 / 0. 17.104 libpostproc 52. 3.100 / 52. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'loop.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2avc1mp41 encoder : Lavf55.19.104 Duration: 00:00:19.56, start: 0.000000, bitrate: 201 kb/s Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x226 [SAR 226:225 DAR 16:9], 129 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 75 kb/s (default) Metadata: handler_name : SoundHandler
ärgerlich speichert ffprobe alles auf stderr, also müssen sie es nach stdout umleiten. Ich werde dir nicht sagen, wie man Eier saugt, dein Sed-Fu ist vielleicht besser als meines, aber für die, die spät kamen, um die Bitrate für den ganzen Shebang im obigen Beispiel zu erhalten, könntest du Folgendes tun:
videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")
und für das audio:
audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")
Ich bin mir nicht sicher, warum die Bitrate des Audios angegeben wurde, nicht aber das Video. Dies liegt möglicherweise daran, dass ich normalerweise mit einem konstanten Ratenfaktor komprimiere (konstante Qualität statt konstanter Bitrate). Sie müssen die ffprobe-Ausgabe in Ihren Filmen überprüfen. Von da an liegt es an Ihnen, das in die Variablen umzuwandeln, die Sie brauchen. Beachten Sie, dass ffmpeg Zahlen wie 100k oder 3m analysiert.