FFmpegによる動画処理テクニック

  • 目次 (ページトップへ)
    1. 動画情報の確認
    1. 動画の切り抜き
    1. 音量の調整
    1. ワーターマークの除去
    1. バッチ処理
  • 5.1 シェルスクリプトによる冒頭部分の一括除去
  • 5.2 冒頭と末尾を同時に処理する方法
    1. 動画の結合
    1. ffmpeg -helpコマンドの詳細
 
1. 動画情報の確認
2. 動画の切り抜き
3. 音量の調整
4. ワーターマークの除去
5. バッチ処理
 5.1 シェルスクリプトによる冒頭部分の一括除去
 5.2 冒頭と末尾を同時に処理する方法
6. 動画の結合
7. ffmpeg -helpコマンドの詳細

本稿では、主にFFmpegを使用して動画ファイルを処理する方法(特にオープニング広告の除去)について記述します。 字幕に関する情報は以下のリソースを参照してください: https://szosoft.blogspot.com/2019/11/ffmpeg-01-subtitle.html https://www.cnblogs.com/sztom/p/11964797.html

  1. 動画情報の確認 =========

$ ffmpeg -i sample_video.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample_video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:11:21.81, start: 0.000000, bitrate: 1637 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1504 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified
  1. 動画の切り抜き =========

まず、時間を指定するオプションを見てみましょう。

  • -ss time_offset: 開始時間オフセットの設定
  • -t duration: 音声/動画の「継続時間」秒を記録または変換
  • -to time_stop: 記録または変換の停止時間を指定

注: -to(時間形式)と-t(秒数)オプションはどちらも継続時間を表していますが、形式が異なります。

開始から7分30秒までの動画を切り抜く(7分30秒以降をすべて除去)方法です。 $ ffmpeg -ss 00:00:00 -i sample_video.mp4 -to 00:07:30 output_730.mp4 この標準的な書き方では、処理速度が少し遅くなることがあります。

最初の1秒を迅速に除去する方法です。 $ ffmpeg -ss 00:00:01 -i output_730-15.mp4 -c copy output_0730-16.mp4 ヘルプ情報を参照してください。

  • -c codec: コーデック名
  • -vcodec codec: 動画コーデックを強制(ストリームをコピーする場合は'copy')
  • -acodec codec: 音声コーデックを強制(ストリームをコピーする場合は'copy')
  • -scodec codec: 字幕コーデックを強制(ストリームをコピーする場合は'copy')

-c copyを追加して直接コピーします。上記のヘルプ情報によると、-vcodec copy -acodec copyのように分けて書くことも可能です。

(以下のような書き方もあります: -c:v copy -c:a copy ですが、この書き方は一部のファイルでのみ有効で、元のファイル(より多くのメタデータやストリームデータを含む)ではエラーが発生することがあります。) 国内の翻訳サイトで編集されたファイルには、この書き方が有効です。 動画の最初の100秒を迅速に切り抜く方法です。 $ ffmpeg -ss 00:00:00 -i sample_show.mp4 -t 100 -c:v copy -c:a copy edited_show.mp4

  1. 音量の調整 =======

-vol volume: 音量の変更(256=通常) 上記のヘルプ情報を参考に、音量を調整します。256より大きい値にすると音量が上がります。最適な値は自分で試してみる必要があります。 $ ffmpeg -ss 00:00:00 -i sample_show.mp4 -vol 1024 adjusted_show.mp4 複数のファイルを連続して再生したいが、それぞれのファイルで音量の差が大きい場合、この機能は非常に便利です。

  1. ワーターマークの除去 =======

-vf filter_graph: ビデオフィルターの設定 関連する利用可能なフィルターを確認します。 $ ffmpeg -filters |grep logo T.. delogo V->V 入力動画からロゴを除去します。 T.. removelogo V->V マスク画像に基づいてTVロゴを除去します。

指定された座標位置の静的ワーターマークを除去します。 $ ffmpeg -i sample_show.mp4 -vf "delogo=x=10:y=20:w=100:h=30:show=0" no_watermark.mp4 #-vf "delogo=x=10:y=20:w=100:h=30:show=0" フィルターの位置は動画の左上角を(1,1)座標とします; サイズ:幅100、高さ30; show=0で枠線なし、show=1で緑色の枠線が表示されます。

  1. バッチ処理 =======

5.1 シェルスクリプトによる冒頭部分の一括除去

ffmpegコマンドファイルの場所を特定します。 $ whereis ffmpeg ffmpeg: /usr/bin/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz

$ which ffmpeg /usr/bin/ffmpeg

動画フォルダに移動し、以下のスクリプトをbatch_process.shファイルとして保存します。

#!/bin/bash
# forループを使用して現在のディレクトリのmp4ファイルを直接取得し、ループ処理で冒頭45秒を除去
for file in *.mp4 ; do
    /usr/bin/ffmpeg -ss 00:00:45 -i "$file" -c copy "/home/videos/processed_$file" -y
done

実行すると、動画ファイルをコピーする程度の時間で完了します。結果を確認し、問題がなければ元のファイルを削除できます。 $ bash batch_process.sh

5.2 冒頭と末尾を同時に処理する方法

参考: https://blog.csdn.net/wchenjt/article/details/105759542

#!/bin/bash
# ここで除去する冒頭と末尾は両方とも7秒です
begin_cut=7
end_cut=7

# forループを使用して現在のディレクトリのmp4、mp3、aviなどのファイルをループ処理します。単一のファイルの場合はforループを外してください
for video in (*.mp4,*.mp3,*.avi ); do
 # メタデータ情報をtmp.logファイルに一時保存します
    nohup /usr/local/ffmpeg/bin/ffmpeg -i "$video" > tmp.log
    # 動画の長さを取得します。形式は 00:00:10,10 (時:分:秒,マイクロ秒)です
    duration="`cat /usr/local/ffmpeg/tmp.log |grep Duration: |awk  '{print $2}'|awk -F "," '{print $1}'|xargs`"
    echo $duration
    # 動画の総長さを計算します。まず、時間、分、秒の値をそれぞれ求めます。ここではマイクロ秒は処理せず、無視します
    hour="`echo $duration |awk -F ":" '{print $1}' `"
    min="`echo $duration |awk -F ":" '{print $2}' `"
    sec="`echo $duration |awk -F ":" '{print $3}'|awk -F "." '{print $1}' `"
    #echo $hour $min $sec
    num1=`expr $hour \* 3600`
    num2=`expr $min \* 60`
    num3=$sec
    # 動画の総長さ(秒)を計算します
    total_seconds=`expr $num1 + $num2 + $num3`  
    
    # 総長さから冒頭と末尾を引いたものが切り抜いた後の動画の長さです。ここで再度hour:min:sec形式に戻す必要はなく、結果を直接使用できます
    new_duration=`expr $total_seconds - $begin_cut - $end_cut`
    echo $new_duration
    /usr/local/ffmpeg/bin/ffmpeg -ss 00:00:07 -i "$video" -t $new_duration -c:v copy -c:a copy "/data/processed/$video" -y
done
  1. 動画の結合 =====

-f fmt: フォーマットを強制します

  1. list.txtファイルを作成し、以下のように結合する動画ファイルリストを記述します
file ./part1.mp4
file ./part2.mp4
file ./part3.mp4
  1. 結合を実行します $ ffmpeg -f concat -safe 0 -i list.txt -c copy combined.mp4

または、以下の1行のコマンドを使用します(bashが必要です) $ ffmpeg -f concat -safe 0 -i <(for f in /mnt/storage/videos/*.mp4; do echo "file '$f'"; done) -c output.mp4

$ ffmpeg -f concat -safe 0 -i <(for f in /mnt/storage/media/ffmpeg/clips/.mp4; do echo "file '$f'"; done) -c copy final_output.mp4* 同じ形式の3つのファイルを選択し、すべて小さいため瞬時に完了しましたが、黄色の文字情報が大量に出力されました。しかし、エラーや警告のキーワードは含まれていませんでした。

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x561923876f40] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from '/dev/fd/63':
  Duration: N/A, start: -0.021333, bitrate: 777 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 648 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Output #0, mp4, to 'final_output.mp4':
  Metadata:
    encoder         : Lavf58.29.100
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 648 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56192387cc40] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 239751, current: 100626; changing to 239752. This may result in incorrect timestamps in the output file.

...

[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 239890, current: 239765; changing to 239891. This may result in incorrect timestamps in the output file.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56192387a540] Auto-inserting h264_mp4toannexb bitstream filter
[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 626151, current: 601136; changing to 626152. This may result in incorrect timestamps in the output file.

...

[mp4 @ 0x56192388e780] Non-monotonous DTS in output stream 0:0; previous: 626176, current: 626161; changing to 626177. This may result in incorrect timestamps in the output file.
frame= 1319 fps=0.0 q=-1.0 Lsize=    7318kB time=00:00:48.03 bitrate=1248.2kbits/s speed= 168x    
video:6593kB audio:693kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.451475%
  1. ffmpeg -helpコマンドの詳細 ===============
ヘルプ/情報/機能の表示: |wc -l
-L ライセンスの表示
-h -- 基本オプションを表示 110
-h long -- より多くのオプションを表示 222
-h full -- すべてのオプションを表示(すべての形式とコーデック固有のオプションを含む、非常に長い) 11352
-h type=name – 指定されたデコーダ/エンコーダ/デマクサ/マクサ/フィルタ/BSFのすべてのオプションを表示
-version バージョンを表示
-buildconf ビルド設定を表示 47
-formats 利用可能な形式を表示 361
-muxers 利用可能なマクサを表示 複用器(mux) 172
-demuxers 利用可能なデマクサを表示 解复用(demux) 311
-devices 利用可能なデバイスを表示 16
-codecs 利用可能なコーデックを表示 463
-decoders 利用可能なデコーダを表示 477
-encoders 利用可能なエンコーダを表示 199
-bsfs 利用可能なビットストリームフィルターを表示 35
-protocols 利用可能なプロトコルを表示 64
**-filters** 利用可能なフィルターを表示 395
-pix_fmts 利用可能なピクセル形式を表示 201
-layouts 標準チャネルレイアウトを表示 58
-sample_fmts 利用可能なオーディオサンプル形式を表示 13
-colors 利用可能な色名を表示 141
-sources device 入力デバイスのソースを一覧表示
-sinks device 出力デバイスのシンクを一覧表示
-hwaccels 利用可能なハードウェアアクセラレーション方法を表示
グローバルオプション(ファイル全体に影響を与える、単一のファイルに限定されません):
-loglevel loglevel ログレベルを設定
-v loglevel ログレベルを設定
-report レポートを生成
-max_alloc bytes 単一の割り当てブロックの最大サイズを設定
-y 出力ファイルを上書き
-n 出力ファイルを決して上書きしない
-ignore_unknown 未知のストリームタイプを無視
-filter_threads 非複雑フィルタースレッドの数
-filter_complex_threads -filter_complexのスレッド数
-stats エンコード中に進捗レポートを表示
-max_error_rate maximum error rate エラー率 (0.0: エラーなし, 1.0: 100%のエラー), この比率を超えるとffmpegは成功の代わりにエラーを返します。
-bits_per_raw_sample 生のサンプルあたりのビット数を設定
**-vol volume** 音量を変更(256=通常)
高度なグローバルオプション:
-cpuflags flags 特定のCPUフラグを強制
-hide_banner プログラムバナーを表示しない
-copy_unknown 未知のストリームタイプをコピー
-benchmark ベンチマーク用のタイミングを追加
-benchmark_all 各タスクのタイミングを追加
-progress url プログラムが読み取り可能な進捗情報を書き込み
-stdin 標準入力でのインタラクションを有効または無効にする
-timelimit limit 最大実行時間を秒単位で設定
-dump 各入力パケットをダンプ
-hex パケットをダンプする際にペイロードもダンプ
-vsync ビデオ同期方法
-frame_drop_threshold フレームドロップのしきい値
-async オーディオ同期方法
-adrift_threshold threshold オーディオドリフトのしきい値
-copyts タイムスタンプをコピー
-start_at_zero copytsを使用する際に入力タイムスタンプを0から開始するようにシフト
-copytb mode ストリームコピー時に入力ストリームのタイムベースをコピー
-dts_delta_threshold threshold タイムスタンプ不連続性デルタしきい値
-dts_error_threshold threshold タイムスタンプエラーデルタしきい値
-xerror error エラー時に終了
-abort_on flags 指定された条件フラグで中止
-filter_complex graph_description 複雑なフィルタグラフを作成
-lavfi graph_description 複雑なフィルタグラフを作成
-filter_complex_script filename ファイルから複雑なフィルタグラフの説明を読み取る
-debug_ts タイムスタンプデバッグ情報を表示
-intra 非推奨 -g 1を使用
-sameq 削除済み
-same_quant 削除済み
-deinterlace このオプションは非推奨です。代わりにyadifフィルタを使用してください
-psnr 圧縮フレームのPSNRを計算
-vstats ビデオ符号化統計をファイルにダンプ
-vstats_file file ビデオ符号化統計をファイルにダンプ
-vstats_version 使用するvstats形式のバージョン。
-qphist QPヒストグラムを表示
-vc channel 非推奨、-channelを使用
-tvstd standard 非推奨、-standardを使用
-isync このオプションは非推奨で、何も行いません
-sdp_file file sdp情報を表示するファイルを指定
-vaapi_device device VAAPIハードウェアデバイスを設定(DRMパスまたはX11表示名)
-init_hw_device args ハードウェアデバイスを初期化
-filter_hw_device device フィルタリング時に使用するハードウェアデバイスを設定
ファイルごとの主要オプション:
**-f fmt** 形式を強制
**-c codec** コーデック名
-codec codec コーデック名
-pre preset プリセット名
-map_metadata outfile[,metadata]:infile[,metadata] infileからoutfileのメタデータ情報を設定
**-t duration** 音声/動画の「継続時間」秒を記録または変換
**-to time_stop** 記録または変換の停止時間
-fs limit_size ファイルサイズの制限をバイト単位で設定
**-ss time_off** 開始時間オフセットを設定
-sseof time_off EOFに対する相対的な開始時間オフセットを設定
-seek_timestamp -ssによるタイムスタンプでのシークを有効/無効にする
-timestamp time 録画タイムスタンプを設定('now'で現在時刻を設定)
-metadata string=string メタデータを追加
-program title=string:st=number... 指定されたストリームを持つプログラムを追加
-target type ターゲットファイルタイプを指定("vcd"、"svcd"、"dvd"、"dv"または"dv50"で、オプションの接頭辞"pal-"、"ntsc-"または"film-"を付けることができます)
-apad オーディオパッド
-frames number 出力フレーム数を設定
-filter filter_graph ストリームフィルタグラフを設定
-filter_script filename ファイルからストリームフィルタグラフの説明を読み取る
-reinit_filter 入力パラメータの変更時にフィルタグラフを再初期化
-discard 破棄
-disposition 配置
高度なファイルごとのオプション:
-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_s 入力ストリームマッピングを設定
-map_channel file.stream.channel[:syncfile.syncstream] あるストリームから別のストリームへオーディオチャネルをマッピング
-map_chapters input_file_index チャプターマッピングを設定
-accurate_seek -ssでの正確なシークを有効/無効にする
-itsoffset time_off 入力tsオフセットを設定
-itsscale scale 入力tsスケールを設定
-dframes number 出力データフレーム数を設定
-re ネイティブフレームレートで入力を読み取る
-shortest 最も短い入力内でエンコードを完了
-bitexact ビット確実モード
-copyinkf 初期の非キーフレームをコピー
-copypriorss 開始時間前のフレームをコピーまたは破棄
-tag fourcc/tag コーデックタグ/fourccを強制
**-q q** 固定品質スケールを使用(VBR)
**-qscale q** 固定品質スケールを使用(VBR)
-profile profile プロファイルを設定
-attach filename 出力ファイルに添付ファイルを追加
-dump_attachment filename 添付ファイルをファイルに抽出
-stream_loop loop count 入力ストリームをループする回数を設定
-thread_queue_size デマクサからのキューイングパケットの最大数を設定
-find_stream_info ヒューリスティックを使用して不足情報を埋めるためにストリームを読み取りデコード
-autorotate 正しい回転フィルターを自動的に挿入
-muxdelay seconds 最大デマックスデコード遅延を設定
-muxpreload seconds 初期デマックスデコード遅延を設定
-time_base ratio 出力ストリームの希望するタイムベースヒントを設定(1:24、1:48000または0.04166、2.0833e-5)
-enc_time_base ratio エンコーダの希望するタイムベースを設定(1:24、1:48000または0.04166、2.0833e-5)。2つの特殊な値が定義されています - 0 = フレームレート(ビデオ)またはサンプルレート(オーディオ)を使用、-1 = ソースタイムベースに一致
-bsf bitstream_filters コンマで区切られたビットストリームフィルターのリスト
-fpre filename 指定されたプリセットファイルからオプションを設定
-max_muxing_queue_size packets すべてのストリームの初期化を待機中にバッファリングできるパケットの最大数
-dcodec codec データコーデックを強制(ストリームをコピーする場合は'copy')
ビデオオプション:
-vframes number 出力ビデオフレーム数を設定
-r rate フレームレートを設定(Hz値、分数または略語)
-s size フレームサイズを設定(WxHまたは略語)
-aspect aspect アスペクト比を設定(4:3、16:9または1.3333、1.7777)
-bits_per_raw_sample 生のサンプルあたりのビット数を設定
-vn ビデオを無効化
**-vcodec codec** ビデオコーデックを強制(ストリームをコピーする場合は'copy')
-timecode hh:mm:ss[:;.]ff 初期TimeCode値を設定。
-pass n パス番号を選択(1から3)
-vf filter_graph ビデオフィルターを設定
-ab bitrate オーディオビットレート(-b:aを使用してください)
-b bitrate ビデオビットレート(-b:vを使用してください)
-dn データを無効化
高度なビデオオプション:
-pix_fmt format ピクセル形式を設定
-intra 非推奨 -g 1を使用
-rc_override override 特定の間隔のレート制御オーバーライド
-sameq 削除済み
-same_quant 削除済み
-passlogfile prefix 2パスログファイル名の接頭辞を選択
-deinterlace このオプションは非推奨です。代わりにyadifフィルタを使用してください
-psnr 圧縮フレームのPSNRを計算
-vstats ビデオ符号化統計をファイルにダンプ
-vstats_file file ビデオ符号化統計をファイルにダンプ
-vstats_version 使用するvstats形式のバージョン。
-intra_matrix matrix イントラ行列係数を指定
-inter_matrix matrix インタ行列係数を指定
-chroma_intra_matrix matrix イントラ行列係数を指定
-top top=1/bottom=0/auto=-1 フィールドファースト
-vtag fourcc/tag ビデオタグ/fourccを強制
-qphist QPヒストグラムを表示
-force_fps 選択されたフレームレートを強制し、最もサポートされているフレームレート選択を無効にする
-streamid streamIndex:value アウトファイルストリームIDの値を設定
-force_key_frames timestamps 指定されたタイムスタンプでキーフレームを強制
-hwaccel hwaccel name HWアクセラレーションを使用したデコード
-hwaccel_device devicename HWアクセラレーション用のデバイスを選択
-hwaccel_output_format format HWアクセラレーションデコードで使用される出力形式を選択
**-vc channel** 非推奨、-channelを使用
-tvstd standard 非推奨、-standardを使用
-vbsf video bitstream_filters 非推奨
-vpre preset ビデオオプションを指定されたプリセットに設定
オーディオオプション:
-aframes number 出力オーディオフレーム数を設定
-aq quality オーディオ品質を設定(コーデック固有)
-ar rate オーディオサンプリングレートをHz単位で設定
**-ac channels** オーディオチャネル数を設定
-an オーディオを無効化
**-acodec codec** オーディオコーデックを強制(ストリームをコピーする場合は'copy')
**-vol volume** 音量を変更(256=通常)
-af filter_graph オーディオフィルターを設定
高度なオーディオオプション:
-atag fourcc/tag オーディオタグ/fourccを強制
-sample_fmt format サンプル形式を設定
-channel_layout layout チャネルレイアウトを設定
-guess_layout_max チャネルレイアウトを推測するための最大チャネル数を設定
-absf audio bitstream_filters 非推奨
-apre preset オーディオオプションを指定されたプリセットに設定
字幕オプション:
-s size フレームサイズを設定(WxHまたは略語)
-sn 字幕を無効化
**-scodec codec** 字幕コーデックを強制(ストリームをコピーする場合は'copy')
-stag fourcc/tag 字幕タグ/fourccを強制
-fix_sub_duration 字幕の継続時間を修正
-canvas_size size キャンバスサイズを設定(WxHまたは略語)
-spre preset 字幕オプションを指定されたプリセットに設定

タグ: FFmpeg 動画処理 ビデオ編集 コマンドライン バッチ処理

5月16日 20:09 投稿