つまり、1テラバイトのドライブにあるすべてのビデオをChromecastで再生できる形式に変換したいのです(https://developers.google.com/cast/docs/media) そして、私は喜んで、それほど新しくない PC を数日間 (数週間?) 稼働させながら、これを実行するつもりです。すばらしい、FFMPEG が救いです。
背景を少し説明します。私は Android/Java 開発者 (StackOverflow で非常にアクティブ) であり、ある時点でバッチ スクリプトをコーディングするか、簡単な Java コマンド ライン (Java の方が使いやすいため) で作業する必要があることはわかっていますが、FFMPEG コマンド ラインでどの引数を使用すればよいかまだわかりません。
私のニーズは次のとおりです。 - ビデオ コーデック: H.264 High Profile Level 5 - オーディオ コーデック: HE-AAC、LC-AAC、MP3 のいずれか (正直違いはわかりません。AAC の方が良いかもしれません) 同じままにします - 低速またはより低速のものを確実に使用します (品質向上のため) - 可変ビットレートの 2 パスを確実に使用します (品質向上のため)
上記のすべてはチュートリアルとマニュアルで達成方法を確認しましたが、今、どのように達成すればよいのかよくわからない部分があります。
最終的なファイル サイズは、元のファイルとほぼ同じにしたいです。これは、ドライブが約 80% 使用されており、単に変換するだけでいっぱいにしたくないためです。スクリプトでは、問題なく作業が進むように、ファイルを再エンコードして元のファイルを削除します。
では、ファイルサイズから video_bitrate と audio_bitrate を取得してスクリプトに組み込むにはどうすればよいでしょうか?
追伸: 同じ作業を実行する方法を知っている人がいれば、ハンドブレーキを使用しても同様に満足です。
ご協力ありがとうございます。
答え1
必要な ffmpeg コマンドは次のようになります。
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 は h264 エンコーダーで、すべてのオプションは ffmpeg から渡されます。説明は不要です。最初のパスではオーディオは必要ないので、-an を使用します。必要に応じて出力を /dev/null にパイプすることもできますが、何でも構いません。2 番目のパスで -y スイッチを使用するので、確認せずに一時ファイルを上書きします。オーディオ コーデックはデフォルトで aac なので、指定する必要はありません。
ffプローブ$videobitrate と $audiobitrate の値を取得するのに役立ちます (POSIX 環境を想定しています。そうでない場合は %videobitrate% と %audiobitrate% になります)。値を使用できる形式にするには、sed、awk、または perl のブードゥーを実行する必要があります。以下は、私のマシン上のランダムな mp4 に対する ffprobe の出力です。
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
面倒なことに、ffprobeはすべてをstderrにダンプするので、stdoutにリダイレクトする必要があります。私はあなたに卵を吸う方法を教えるつもりはありません、あなたのsed-fuは私のものより優れているかもしれませんが、遅れて来た人たち上記の例の全体のビットレートを取得するには、次のようにします。
videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")
オーディオの場合:
audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")
オーディオのビットレートが指定されているのに、ビデオのビットレートが指定されていない理由はわかりませんが、通常は一定のレート係数 (一定のビットレートではなく一定の品質) で圧縮しているためかもしれません。ムービーの ffprobe 出力を確認する必要があります。そこから、それを必要な変数に変換するのはあなた次第です。ffmpeg は 100k や 3m などの数値を解析することに注意してください。