web-dev-qa-db-ja.com

ffmpegを使用してH.265 mkvをH.264にバッチ変換して、ファイルを再エンコードに対応させる

リソースを大量に消費するH.265エンコードファイルがあり、それらはうまく再生できず、変換ソフトウェア(mencoder)は(現在)H.265フォーマットをサポートしていません。コマンドラインバッチファイルでそれらをH.264に変換して、Devede/OGMripを使用して再圧縮のためにファイルを迅速に変換できますか?このサイトを検索しても、説明されていないので、役に立つ質問であると思うものとその質問への回答を投稿します。

28
TheMegolith

はい、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に次のファイルをキューに入れる時間を与えて、プロセスを休ませる

33
TheMegolith

H.265からH.26​​4へのバッチ変換

これらの例は最近の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 を参照してください。

MP4出力

これはもう少し複雑です。これは、入力オーディオが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で再開します。

18
llogan

前の答えを考慮して、私は次のことを思いつきました。

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に置き換えられます。

ファイルの命名が異なる場合、それに応じてコマンドを調整する必要があります。

0
kerner1000