リソースを大量に消費するH.265エンコードファイルがあり、それらはうまく再生できず、変換ソフトウェア(mencoder)は(現在)H.265フォーマットをサポートしていません。コマンドラインバッチファイルでそれらをH.264に変換して、Devede/OGMripを使用して再圧縮のためにファイルを迅速に変換できますか?このサイトを検索しても、説明されていないので、役に立つ質問であると思うものとその質問への回答を投稿します。
はい、ffmpeg
を使用します。
ターミナルを開いて、ffmpeg
と適切なライブラリがインストールされ、それらがMKV形式であると想定し、H.265エンコードファイルを含むディレクトリにそれを向けて、ターミナルウィンドウに以下をコピーアンドペーストします。
INPUT="$1"
for i in *.mkv ; do
ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
mv "$i.ts" "$i.mpg"
sleep 3
done
そこにあります。これは、同じディレクトリのMPGコンテナでh.264に変換されます。
コマンドスイッチの説明:
for i in *.mkv ; do ... done
これにより、ディレクトリ内のすべての.mkvファイルがバッチプロセスに含まれるように設定されます。これは、処理するファイルのコンテナ拡張に対応するために変更される場合があります。
ffmpeg -i "$i"
プログラムffmpegを実行し、処理するファイルを呼び出します。
-bsf:v
は、使用するビデオビットストリームフィルターをアクティブにします。
h264_mp4toannexb
-アクティブ化されるビットストリームフィルターです。
H.264ビットストリームを長さプレフィックスモードから開始コードプレフィックスモードに変換します(ITU-T H.264仕様の付録Bで定義されています)。
これは、一部のストリーミング形式で必要です。通常、MKV h.264を処理するMPEG-2トランスポートストリーム形式(mpegts
)(現在)が必要です。含まれていない場合は、ターミナルウィンドウでエラーが表示されます。これを使って。
-sn
は、字幕ストリームのストリーミングを停止します(ビデオに字幕が不要な場合)これはオプションであり、削除できます。
-map 0:0 -map 0:1
ファイルの最初の2つのストリームのみを処理するようにffmpegに指示します(0:0
はビデオストリーム、0:1
はファイルの最初のオーディオストリームです)。これは2つのことを行い、余分なオーディオストリームを取り除きます。通常、最初のオーディオストリームは英語ですが、常にではありません。埋め込み字幕などの他のストリームは削除され、ファイルサイズが小さくなります。これもオプションの文字列です。 ffprobe
を使用して、ファイルで使用可能なストリームを表示できます。 -map
はオプションであり、コマンドから破棄できます。
-vcodec libx264
これは、ffmpegに出力をH.264にエンコードするよう指示します
"$i.ts"
出力を.ts形式で保存します。これは、ソースファイルを上書きしないために役立ちます。
mv "$i.ts" "$i.mpg"
同じディレクトリ内のファイル拡張子をMPGに変換します。これは、好きなディレクトリに送信するように設定できます。
sleep 3
-ffmpegに次のファイルをキューに入れる時間を与えて、プロセスを休ませる
これらの例は最近のffmpeg
向けに書かれています。いくつかのトラブルを回避してください ダウンロード 最新バージョン。次に、ffmpeg
バイナリを~/bin
または/usr/local/bin
に配置します(気づくには、ログアウトしてからログインする必要がある場合があります)。
mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
この例は、h264vids
という名前のディレクトリに出力します。
この例では、入力が.mp4
であると想定しています。そうでない場合は、例の.mp4
インスタンスを入力ファイルタイプに変更するか、貪欲な*
を単独で使用します。
-crf
で品質を調整し、-preset
でエンコード速度/効率を調整します。または、これらのオプションを削除して、ほとんどの場合十分なデフォルト値を使用します(例では、これらのオプションにデフォルト値を使用しています)。これらのオプションの詳細については、 FFmpeg Wiki:H.264 を参照してください。
これはもう少し複雑です。これは、入力オーディオがAACかどうかに応じて条件付きエンコードを実行します。入力オーディオがAACの場合、オーディオはそのままストリームコピー(再多重化)され、不要な再エンコードが回避されます。入力オーディオがnotAACの場合、AACに再エンコードされます。
ffprobe
およびffmpeg
を使用してこれを行う方法を示す簡単なスクリプトを次に示します。変換する動画を含むディレクトリにコピーして保存し、chmod +x yourscriptname
で実行権限を付与してから、./yourscriptname
で実行します。
#!/bin/bash
audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
mkdir h264vids
for f in *.mkv
do
if [ "$audioformat" = "aac" ]; then
ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
else
ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
fi
done
この例は、h264vids
という名前のディレクトリに出力します。
この例では、入力が.mkv
であると想定しています。そうでない場合は、例の.mkv
インスタンスを入力ファイルタイプに変更するか、貪欲な*
を単独で使用します。
-crf
および-preset
に関する注意を参照してください。
エンコードを一時停止できます ctrl+z fg
で再開します。
前の答えを考慮して、私は次のことを思いつきました。
for file in *265.mkv; do Nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done
これは、ファイルの名前が常に265.mkv
で終わることを前提としています。この末尾は264.mkv
に置き換えられます。
ファイルの命名が異なる場合、それに応じてコマンドを調整する必要があります。