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

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

5月17日 05:09 投稿