3 ポイント 投稿者 GN⁺ 2023-07-31 | 1件のコメント | WhatsAppで共有
  • ffmprovisrは、FFmpegコマンドの作成が難しいユーザー向けに、作業を選ぶとサンプルコマンドとフラグごとの説明を確認できるコマンド生成支援サイト
  • レシピは ffmpegffplayffprobe を中心に、入力ファイル、コーデック、フィルター、ストリームマッピング、出力コンテナといった要素を分解して示す
  • 扱う範囲は、リラップ/トランスコードから、切り出し・結合、字幕・ウォーターマーク、サムネイル・GIF、テストファイル、メタデータ・チェックサム・QCToolsレポートまで幅広い
  • サイト内検索はないが、すべてのレシピを展開したあと、ブラウザー検索で必要な キーワード を探す方法が案内されている
  • FFmpeg以外にも、CDDAリッピング、ImageMagick、flac などのツールも扱っており、デジタル保存ワークフロー向けの実務コマンド集として使える

ffmprovisrが提供するもの

  • ffmprovisrは、作業別のサンプルコマンドとオプション説明を提供し、FFmpegコマンドを自分で組み立てなければならない負担を減らす
  • ユーザーは作業ボタンを押して単一コマンドまたは関連コマンド一覧に移動し、サンプルコマンドとフラグごとの動作を確認する
  • ページ自体には検索機能がなく、すべてのレシピを開いたうえで ctrl+f または cmd+f によるブラウザー検索を使うよう案内している
  • 基本の参考資料として、FFmpegの公式ウェブサイト、Reto Kromerのinstallation instructionsCommand Line Crash Courseexplainshell.comにリンクしている
  • ライセンスは Creative Commons Attribution 4.0 International License である

FFmpegコマンドを読む基本的な方法

  • FFmpegはインストール後、コマンドプロンプトで ffmpeg を入力して呼び出す
  • コマンドは通常、フラグと値の組で構成される
    • -i input_file.ext では、-i は入力ファイルを指定するフラグで、input_file.ext は対象ファイルである
    • -c:v prores では、-c:v はビデオストリームのエンコードを指定し、prores は使用するコーデックである
  • 出力ファイル名はコマンド末尾に置かれ、個別の出力フラグなしでファイル名として指定する
  • ffmpeg は動画を保存し、ffplay は生成された動画を保存せず再生できる
    • SMPTE bars を保存する例は ffmpeg -f lavfi -i smptebars=size=640x480 -t 5 output_file
    • SMPTE bars を再生する例は ffplay -f lavfi smptebars=size=640x480
    • FFmpegの例では -i、録画時間の -t 5、出力ファイルが必要だが、FFplayの例では -i は不要である

エラーを減らすためのチェックポイント

  • 出力ファイルが開けるか、再生できるか、意図どおりに見え聞こえるかを確認する必要がある
  • 出力拡張子は意図したコーデックと一致している必要があり、一部の拡張子はFFmpegで特定コーデックの既定値につながる
    • たとえば .mp4 は H.264 エンコードが既定になることがある
  • "Error: No such file or directory" は、誤ったディレクトリ、タイプミス、空白の欠落、誤って結合されたフラグが原因で発生することがある
    • macOSでDownloadsフォルダーへ移動するには cd $HOME/Downloads を使う
    • コピー&ペーストしたコマンドが正しく見えてもエラーになる場合は、コマンドラインで直接打ち直す方法が推奨される
  • "Could not find tag for codec" は、出力拡張子と互換性のない音声・映像コーデックを持つファイルをリラップしようとしたときに発生する
    • 先に適切なコーデックへトランスコードするか、拡張子が正しいコーデックへ自動エンコードすると確信できる場合は -c copy を外せる
  • "Killed" は、ファイルがサーバーのメモリー容量を超えたときに表示されることがある
    • リモートサーバーではメモリー容量を増やすことで解決できる場合がある
    • ローカルサーバーではFFmpegのバージョンを最新に保ち、メモリーを多く使うほかのプログラムと同時実行しないほうがよい
  • フィルター使用中に "Error splitting argument list: option not found" が出た場合は、引用符の使い方 とフィルターグラフの形式を確認する必要がある
  • フィルターはストリームの再エンコードが必要なため、ファイルストリームをそのままコピーする -c copy と一緒に使うと問題が起きることがある

フィルターグラフ、ストリームマッピング、既定コーデック

  • ループ内でFFmpegのバッチ処理を実行するときは、入力の前に -nostdin を置くことで、標準入力との対話を行う既定動作を上書きできる
    • 例: ffmpeg -nostdin -i input_file ...
  • FFmpegは出力ファイル形式に応じて、コーデックとコーデックパラメーターの既定値 を自動設定する
    • .avi: 音声 mp3、映像 mpeg4
    • .mkv: 音声 ac3、映像 H.264
    • .mov: 音声 AAC、映像 H.264
    • .mp4: 音声 AAC、映像 H.264
    • .mpg: 音声 mp2、映像 mpeg1video
    • .mxf: 音声 pcm_s16le、映像 mpeg2video
    • .wav: 音声 pcm_s16le
  • フィルターグラフ は、-vf または -af の後ろに続くフィルター名とオプションの組み合わせである
    • -vf-filter:v の別名である
    • 映像フィルターの例は hflip、音声フィルターの例は amerge である
    • 複数のフィルターはカンマでつなぎ、複数のフィルターチェーンはセミコロンで区切る
    • -vf "fieldmatch,yadif,decimate" は inverse telecine 処理に使われる1本のフィルターチェーンである
    • 入力または出力が2つ以上ある場合は、-vf の代わりに -filter_complex を使う必要がある
    • まっすぐな引用符を使う必要があり、曲がった引用符は避ける
  • ストリームマッピング は、入力ファイルの映像、音声、字幕、データ、添付ストリームのうち、どれを出力に含めるかを決める
    • FFmpegは avsdt のストリームタイプを認識する
    • -map 0:v は、最初の入力ファイルのすべての映像ストリームを選択する
    • -map 0:3 は、最初の入力ファイルの4番目のストリームを選択する
    • -map 0:a:2 は、最初の入力ファイルの3番目の音声ストリームを選択する
    • マッピングを指定しない場合、動画ファイルの既定では映像1本と音声1本だけが出力に含まれる
    • すべてのストリームをマッピングするには -map 0 を使う
    • -map 0:a? のように ? を付けると、バッチ処理中に音声のないファイルでもエラーなく進められる

コンテナ変更とトランスコーディング

  • ファイルのリラップは ffmpeg -i input_file.ext -c copy -map 0 output_file.ext で行う
    • 内部の映像・音声・字幕データは変更せず、別のコンテナ形式へ移す
    • リラップは remuxing または re-multiplexing とも呼ばれる
    • -map 0 を使うと、複数の音声トラックのようなすべてのストリームを保持できる
    • 一部のコンテナは特定のストリームエンコーディングしか格納できないため、再エンコードなしではリラップできない場合がある
  • Broadcast WAV の作成では、-write_bext 1-metadata field_name='Content'BEXT チャンク と関連メタデータを書き込む
    • よく使われるフィールドは description, originator, originator_reference, origination_date, origination_time, coding_history, IARL である
    • BWF メタデータフィールドには文字数制限があり、OriginatorReference は最大 32 文字である
  • DV コーデック映像を .dv ファイルへリラップする場合は、-f rawvideo -c:v copy を使い、DV ストリーム内の出所メタデータが意図せず削除されるのを避ける
  • Apple ProRes LT へのトランスコーディング例は -c:v prores -profile:v 1 -vf yadif -c:a pcm_s16le である
    • ProRes 422 プロファイルは 0 Proxy、1 LT、2 Standard、3 HQ に分かれる
    • ProRes のコンテナは QuickTime .mov、Matroska .mkv、MXF .mxf が FFmpeg でサポートされている
  • H.264 へのトランスコーディング例は -c:v libx264 -pix_fmt yuv420p -c:a aac である
    • libx264 のデフォルトは medium プリセットと CRF 23 である
    • -pix_fmt yuv420p は、QuickTime とほとんどの非 FFmpeg ベースのプレーヤーとの互換性のために 4:2:0 クロマサブサンプリングを指定する
    • ストリーミング最適化には -movflags +faststart を追加する
    • より高品質な例として -preset veryslow -crf 18 があり、CRF 18 はしばしば「視覚的にロスレス」とみなされる
  • Nvidia GPU ベースの H.264/H.265 エンコードでは h264_nvenc または hevc_nvenc を使う
    • Nvidia の固定機能ハードウェアは CPU エンコードより 10 倍の性能を出せる場合があるが、低ビットレート時の画質最適化にはより多くのパラメータが必要となる
    • HEVC はおよそ 2015 年以降の GPU でサポートされる、より効率的なコーデックとして説明されている
  • H.265/HEVC へのトランスコーディングでは -c:v libx265 -pix_fmt yuv420p -c:a copy を使う
    • libx265 のデフォルトは medium プリセットと CRF 28 である
    • H.265 の CRF 28 は H.264 の CRF 23 に相当し、ファイルサイズはおよそ半分になることがある
  • 保存用のロスレス例として、FFV1 Version 3 を Matroska コンテナに格納し、入力 framemd5 を同時に生成するコマンドがある
    • -map 0 はすべてのストリームをマッピングする
    • -dn は Matroska が許可しないデータストリームを除外する
    • -slicecrc 1 は、デコーダーが破損したスライスを検出できるよう CRC 情報を追加する
    • -f framemd5 -an は映像フレームごとの MD5 チェックサムを生成する

映像・音声属性の変更

  • アスペクト比変更のレシピではパディングフィルタを使う
    • 4:3 を 16:9 にする場合は pillarbox を適用する
    • 16:9 を 4:3 にする場合は letterbox を適用する
    • 無音の映像では -c:a copy の代わりに -an を使える
  • SD を HD に変換する例では、colormatrix=bt601:bt709scale=1440:1080:flags=lanczospad=1920:1080:240:0 の 3 つのフィルタを使う
    • Rec. 601 から Rec. 709 へ輝度係数を変更する
    • Lanczos スケーリングはデフォルトの bilinear より遅いが、よりよい結果を提供する
    • インターレースソースはスケーリング前に yadif でデインターレースするよう案内している
  • 表示アスペクト比は -aspect 4:3 のようなオプションでコンテナレベルから変更できる
    • -c:v copy と併用すると、エンコードされたフレーム内のアスペクト比ではなく、コンテナに保存されたアスペクト比に影響する
  • 色空間変換では colormatrix=src:dst フィルタを使う
    • 利用可能な値には bt601, smpte170m, bt470bg, bt709, bt2020 が含まれる
    • 色空間メタデータの埋め込みには -color_primaries, -color_trc, -colorspace を使う
    • 実際には Rec.601 のファイルに Rec.709 タグを付けることもできるため、注意が必要である
    • メタデータタグは libx264 または libx265 が書き込むため、再エンコードなしで追加することはできない
  • 速度変更では setptsatempo を組み合わせて使う
    • 例として、24fps を 25fps に変えつつ音声ピッチを維持する PAL アクセスコピーの作成がある
  • フェード処理では fadeafade フィルタを使い、フィルタを使うため映像と音声を再エンコードする必要がある
  • 音声抽出は -c:a copy -vn で映像なしに音声ストリームをロスレスで抽出する
  • 2 つの音声トラックの結合には amerge-filter_complex を使う
    • YouTube 自動キャプションのように 1 本の音声トラックを想定する後続処理に有用な場合がある
    • 目的のトラックを確認するには、スクリプト作成前に ffprobe を実行することが推奨される
  • 音量分析と正規化には loudnorm フィルタを使う
    • JSON 出力は 2-pass 正規化の入力値として使える
    • デフォルト値は PBS 推奨の目標音量によく合うと説明されている
    • 1-pass は高速だが、2-pass より精度が低い
  • CD pre-emphasis、RIAA equalization、音声リサンプリング、192kHz WAV を 96kHz として強制解釈するレシピも含まれる

切り出し、結合、セグメント

  • 同じ技術仕様のファイルを結合する場合は concat demuxer を使う
    • ffmpeg -f concat -i mylist.txt -c copy output_file
    • 結合するファイルは同一のコーデックと技術仕様である必要があり、結果ファイルは必ず事前にプレビューすべきである
    • 絶対パスを使うには -safe 0 を追加する
  • 異なるファイル形式やコーデックのファイルを結合する場合は concat フィルタと -filter_complex を使う
    • 入力ファイルはコンテナ、コーデック、クロマサブサンプリング、フレームレートなどが異なっていてもよい
    • 基本例は同じ解像度の場合にのみ正しく動作する
    • フレームレートが異なる場合、出力は可変フレームレートになることがある
    • 解像度が異なる場合は concat 前に scale でそろえ、SD と HD を結合する場合は SD に pillarbox 処理を行える
  • ファイル分割は segment muxer で処理する
    • -segment_time 60 は最大 60 秒単位のセグメントを生成する
    • %03d は 3 桁のゼロ埋め連番ファイル名を作る
  • 再エンコードなしのトリミングでは -ss, -to, -t, -c copy, -map 0 を使う
    • H.264 のようなインターフレームコーデックでは、i-frame 基準で最も近い位置から始まることがある
    • -sseof -5 はファイル終端の 5 秒前からコピーする方式である
  • 音声ファイル先頭の無音除去には silenceremove=start_threshold=-57dB:start_duration=1:start_periods=1 を使う
    • -57dB はアナログヒスを考慮するのに適した水準として示されている
    • フィルタ使用のため音声は再エンコードされる
  • 音声ファイル末尾の無音除去は areverse, silenceremove, areverse の順で処理する
    • silenceremove は先頭部分の無音除去により適しているため、音声を反転してから再び元に戻す

インターレース映像の処理

  • SD NTSCソースからHD H.264アクセスファイルを作成する際は、yadifscalepadformat=yuv420pを組み合わせて使用する
    • yadifはデインターレースフィルター
    • scale=1440:1080:flags=lanczosは画像を1440x1080に調整する
    • pad=1920:1080:(ow-iw)/2:(oh-ih)/2は4:3入力を16:9出力フレームに合わせてパディングする
  • 一般的なデインターレースの例は-vf "yadif,format=yuv420p"
    • format=yuv420pはH.264再生互換性のために4:2:0クロマサブサンプリングを指定する
    • FFmpegにはyadifのほかにbwdifw3fdifkerndeintnnediデインターレーサーがある
  • フィールドをフレームに分離するデインターレースではidet,bwdif,format=yuv420pを使用する
    • 動きの多いインターレース映像でソースの視覚的なcadenceを保つために好まれる
    • idetはフィールド順を検出する
    • bwdifはデフォルトで各フィールドごとに1フレームを出力する
  • inverse telecineではfieldmatch,yadif,decimateを使用する
    • 3:2 pulldownを戻して29.97fpsインターレース映像を元のフィルムソースの24fpsフレームレートに復元する
    • 29.97iファイルに適用すると出力フレームレートは実際には23.976fpsになる
  • フィールド順の変更にはsetfield=tffまたはsetfield=bffを使用する
    • ビデオフィルターを使用するため-c copyは使えず、再エンコードが必要
  • インターレースパターンの確認はffmpeg -i input_file -filter:v idet -f null -で出力ファイルなしに解析する

ウォーターマーク、字幕、サムネイル、GIF

  • テキストウォーターマークはdrawtextフィルターで生成する
    • fontfilefontsizetextfontcoloralphaxyオプションを指定する
    • x=(w-text_w)/2:y=(h-text_h)/2は映像サイズに関係なく中央に配置する
  • 画像ウォーターマークはoverlay=main_w-overlay_w-5:5で右上に配置できる
  • バーンインタイムコードはdrawtexttimecodeboxboxcolorrateオプションを使用する
    • 開始タイムコードはhh:mm:ss[:;.]ff形式
  • 字幕ファイルの埋め込みには-i subtitles_file -c copy -c:s mov_textを使用する
    • mov_textはMP4およびMOVコンテナで動作する
    • MKVコンテナで許容される形式はASSSRTSSA
  • サムネイル1枚は-ss 00:00:20 -vframes 1 thumb.pngで抽出する
  • 1分ごとにサムネイルを作るには-vf fps=1/60 out%d.pngを使用する
  • 画像シーケンスをGIFにする際はimage2-framerate-pattern_type globscaleを使用する
  • 高品質GIFは2段階で生成する
    • 最初のコマンドはpalettegenでカスタムパレットを作成する
    • 2つ目のコマンドはpaletteuseでパレットを適用する
    • より単純な方法は-vf "fps=10,scale=500:-1"を使うことだが、ディザリングがより目立ち、ファイルサイズは小さくなる

画像シーケンス、スコープ、OCR

  • 画像シーケンスを10-bit非圧縮ビデオにする際は-f image2 -framerate 24 -i input_file_%06d.ext -c:v v210を使用する
    • image2 demuxerのデフォルトフレームレートは25fps
    • %06dは6桁の数字ファイル名を昇順で読み込む
  • 画像と音声ファイルを結合して動画を作る際は-loop 1-shortest-vf scale=1280:720を使用する
    • 音声ファイルをYouTubeのようなプラットフォームにアップロードしたいときに役立つことがある
  • ffplay -f lavfiとフィルターを使って、音声ビット深度の可視化、デシベルグラフ、放送範囲外ピクセルの表示、vectorscopeの表示ができる
  • tblend=all_mode=difference128hstackは2つの入力映像の時間的な差を並べて表示する
  • xstackは複数の映像ソースを縦または横に積み重ねる出力ウィンドウを作るために使われ、vrecordで使う出力ウィンドウと同様の用途に有用
  • OCRの例ではocrフィルターとdrawtextを使って認識されたテキストを映像上に表示する
  • OCRデータの出力はffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=input_file,ocr"の形で画面に出力する

メタデータ、チェックサム、保存作業

  • 技術メタデータの抽出はffprobe -i input_file -show_format -show_streams -show_data -print_format xmlで行う
    • 出力形式はXMLのほかにJSON、flatも使用できる
  • メタデータの削除には-map_metadata -1 -c:v copy -c:a copyを使用する
    • 映像と音声はコピーし、メタデータはコピーしない
  • Bashバッチ処理は.shファイルとforループで行う
    • 例: for file in *.mxf; do ffmpeg -i "$file" -map 0 -c copy "${file%.mxf}.mov"; done
    • .shファイルと処理対象の.mxfファイルは同じディレクトリにある必要があり、そのディレクトリで実行する必要がある
    • 再帰処理にはfind input_directory -iname "*.mxf" -exec ffmpeg -i {} -map 0 -c copy {}.mov \;を使用できる
  • WindowsではPowerShellの.ps1スクリプトでバッチ処理を行う
    • 例では.mp4ファイル一覧を作成し、各ファイルの拡張子を.mkvに変えてリラップする
    • ffmpegをフルパスなしで呼び出すには正しく設定されている必要がある
  • デコーダーエラーの確認はffmpeg -i input_file -f null -で出力ファイルなしにデコードし、エラーを画面に出力する
  • FFV1 Version 3のfixity確認は-report -i input_file -f null -でCRC checksum mismatchを確認する
    • Frame CRCはFFV1 Version 3でデフォルト有効
  • フレーム単位の映像MD5は-f framemd5 -anで生成する
  • 音声サンプルグループごとのMD5はasetnsamples=n=48000 -f framemd5 -vnで生成する
    • サンプルグループ数はメディアのサンプルレートに合わせるのが良い実務とされる
    • デフォルトでは音声は16-bit PCMにトランスコードされてframemd5が生成される
  • ストリームMD5は映像と音声ストリームをそれぞれ-mapし、-c copy -f md5で作成できる
    • コンテナメタデータの変化とは独立してA/V情報の完全性を検証するために使う
  • streamhashはすべてのストリームについてストリームごとのハッシュを出力する
    • どのストリームがいくつあるかを知る必要がないため、混在したborn-digital materialのハッシュ化に有用
  • QCToolsレポートはffprobe -f lavfisignalstatscropdetectidetpsnrssimebur128astatsなどを使用して.qctools.xml.gzを生成する
    • 音声ありのファイル用と音声なしのファイル用のコマンドが別々に用意されている
  • EIA-608 Line 21クローズドキャプションの抽出はreadeia608フィルターとffprobeでhex値をCSVとして出力する

テストファイルとその他のFFmpeg例

  • テスト動画は mandelbrotsmptebarstestsrcsmptehdbars などの lavfi 入力で作成または再生する
    • Mandelbrot の例は 1280x720、25fps、10秒の H.264 出力
    • SMPTE bars の例は 720x576、25fps、10秒の ProRes 出力
    • HD SMPTE bars の再生は ffplay -f lavfi -i smptehdbars=size=1920x1080
    • VGA SMPTE bars の再生は ffplay -f lavfi -i smptebars=size=640x480
  • サイン波のテスト音声は sine=frequency=1000:sample_rate=48000:duration=5pcm_s16le で WAV ファイルを生成する
  • SMPTE bars と 1kHz のサイン波を組み合わせたテスト動画は、2つの lavfi 入力と -c:v ffv1-c:a pcm_s16le を使う
  • 破損テストファイルは -bsf noise=1 -c copy でパケット内容を意図的に破損させるが、コンテナは破損させない
  • Conway's Game of Life は ffplay -f lavfi life=... でシミュレーションし、ffmpeg-t 5 を使えば一部区間を保存できる
  • 2つの動画の知覚的類似性比較には signature=detectmode=full:nb_inputs=2 フィルタを使う
  • 入力動画の知覚ハッシュは signature=format=xml:filename="output.xml" で XML ファイルを生成する
  • 画像シーケンスは ffplay -framerate 5 input_file_%06d.ext で動画を作らずにそのまま再生できる
  • 音声トラックと映像トラックの分離は -map 0:v:0-map 0:a:0 を使う
  • 音声トラックと映像トラックの結合は -map 0:v -map 1:a -c copy で最初のファイルの映像と2番目のファイルの音声を組み合わせる
  • DVD オーサリング用 ISO 作成向けの MPEG ファイルは -aspect 4:3 -target ntsc-dvd output_file.mpg で作成し、dvdauthor のインストールが必要
  • YDIF ベースのシーン検出用 CSV は ffprobesignalstatslavfi.signalstats.YDIF 値を出力する
  • head switching noise は drawbox=w=iw:h=7:y=ih-h:t=max でフレーム下部に黒いボックスを描いて隠せる
  • RTMP 宛てライブ配信とローカル MP4 記録を同時に行うには tee muxer を使う
    • 入力を幅 1280px にスケールし、指定時間後にストリームを終了する
    • 例には、実際のテレビ番組のライブ配信で約4年間、毎日使っていたというメモが含まれる
  • 特定の decoder、encoder、demuxer、muxer、filter 情報は ffmpeg -h type=name で確認できる
    • 例は encoder=libx264decoder=mp3muxer=matroskademuxer=movfilter=crop

FFmpeg とあわせて紹介されている関連ツール

  • CDDA リッピングツールは CD ドライブのオフセット確認と正確なオーディオ CD リッピングを扱う
    • CD ドライブのモデルごとに読み取り開始位置が異なるため、同一コンテンツのチェックサム検証にはオフセット補正が必要
    • ドライブ識別は cdda2wav -scanbuscdda2wavcdparanoia -vsQ で確認できる
    • オフセットは Accurate Rip CD drive offset list で探す
    • macOS の GUI ツールとして XLD を紹介している
  • CD Paranoia でのリッピングは cdparanoia -L -B -O [Drive Offset] [Starting Track Number]-[Ending Track Number] output_file.wav を使う
    • -B はトラックを自動で別ファイルに分割する batch モード
  • Cdda2wav は Paranoia library を使ってオーディオ CD を正確にリッピングするツール
    • Homebrew でのインストールコマンドは brew install cdrtools
    • 例のコマンドは CD 全体を1つの WAV としてリッピングし、CDDB を参照し、cue sheet を生成する
    • macOS ではコマンド実行前に CD を unmount する必要がある
  • CD emphasis は、1980年代初期の一部 CD や日本プレス盤 CD に影響することがあるノイズ低減方式として説明されている
    • 有無の確認は cdda2wav -J または cdparanoia -Q で行う
    • Cdda2wav でリッピング中に補正するには -T フラグを追加する
  • ImageMagick はラスタ画像とベクタ画像ファイルを表示、変換、編集する無料のオープンソースソフトウェア群
    • コマンドは convertmontagemogrify のように個別コマンドとして呼び出す
    • 画像比較は compare -metric ae image1.ext image2.ext null: で異なるピクセル数を返す
    • サムネイル生成は mogrify -resize 80x80 -format jpg -quality 75 -path thumbs *.jpg を使う
    • 画像グリッドは montage @list.txt -tile 6x12 -geometry +0+0 output_grid.jpg で作成する
    • EXIF 削除は mogrify -path ./stripped/ -strip *.jpg を使う
  • flac ツールは FLAC プロジェクトが作成した FLAC トランスコード・メタデータ操作ツール
    • 他のツールと比べて BWF のような foreign metadata を埋め込める利点がある
    • WAV から FLAC に変換しつつ BWF メタデータを保持するには flac --best --keep-foreign-metadata --preserve-modtime --verify input.wav を使う
    • FLAC から元の BWF を再構成するには --best の代わりに --decode を使う

1件のコメント

 
GN⁺ 2023-07-31
Hacker News のコメント
  • 少し話題から外れるけれど、ffmpeg はこれまで作られたソフトウェアの中でも最高レベルだと思う
    Fabrice Bellard のような才能あるエンジニアは FOSS コミュニティにとって大きな贈り物だし、以前働いていた評価額約20億ドルのユニコーンでも、製品の大部分が ffmpeg に依存していた

    • それなら、かなり大きな金額を寄付したんだよね?
      https://ffmpeg.org/donations.html
    • 「Fabian Fabrice」ではなく Fabrice Bellard です
      QEMU、TCC、QuickJS なども作った人
    • 彼のような人はいない。Fabrice Bellard と同じリーグにいる人もいないし、そもそも同じゲームをしている人すらいないように見える :-)
      真面目な話、どの瞬間を取っても、彼が書いたコードが動いているデバイスの数は本当にとんでもない
    • ちなみに「FFmpeg」の「FF」は「fast forward」を意味する
    • ffmpeg は好きだけれど、ARM 性能は改善が必要
  • ffmpeg のコマンドラインは、良いガイドを見ても相変わらず頭を抱えるので、VapourSynth を勧めたい
    https://www.vapoursynth.com/
    最適化された Python 風の動画フィルタリングツールだが、それ以上に多くのことができる: https://vsdb.top/
    それに StaxRip は ffmpeg、VapourSynth、数十個のエンコーダやツールをうまく活用していて、このために Linux から Windows に再起動するほど: https://github.com/staxrip/staxrip

    • もっと良いコマンドラインインターフェイスを持つ ffmpeg ラッパーがあるだけでも本当にありがたい
      不必要に複雑で、ある観点では全体として筋が通った構造なのかもしれないが、ごく一般的な作業をするのに呪文のようなオプションを知らなければならないのはおかしい
      150文字の ffmpeg コマンドを2語に縮めた bash エイリアスが何十個もあるはず
      ffprobe も納得できなくて、99% は引数なしで実行して長さ、解像度、フレームレート、オーディオトラック数あたりをさっと見たいだけなのに、出力の99%はコンパイルオプションのようなまったく関係ない内容
  • あわせて見るとよい資料:
    https://ffmpeg.guide/ — 複雑な FFmpeg フィルタグラフを素早く正確に作成
    https://www.hadet.dev/ffmpeg-cheatsheet/ — カット、フェードイン/アウトの追加、スケーリング、連結など

    • 2つ目のリンクのカットコマンドは、私の経験では理想的ではなかった
      理由は不明だが、ffmpeg は -ss-t/-to フラグを -i の前に置くか後に置くかで挙動が変わり、私の場合は前に置くほうがうまくいった
      元記事にも同じ問題がある
    • ffmpeg.guide は素晴らしそうだが、ffmpeg 自体にもっと良い何かがあるべきだと感じる
      非線形なグラフを、平坦で線形なコマンドラインに無理やり押し込むのは変だ
      もっと詳しい JSON 設定があるだけでもずっと良くなる
    • ffmpeg.guide は本当に良い。ImageMagick にも似たものはある?
    • ただ ffmpeg-python を使えばいい
  • とても便利
    ffmpeg コマンドを作るのに ChatGPT を使い始めたら、必要なものを見つけるのがずっと速く簡単になった
    コマンドラインから直接できる小さなツールも作った: https://github.com/alexkrkn/help-cli
    関連動画も作った: https://www.youtube.com/watch?v=pOda6TDBqcY

  • 最近 ffmpeg の UI を探していて Shutter Encoder を見つけたが、オープンソースで mac/windows に対応した、とても良いソフトウェアだった
    ようやく15年分、300GBの個人動画コレクションを圧縮し始めた
    https://www.shutterencoder.com/
    すべて H.265 で圧縮中で、動画サイズが時には 1/10 まで小さくなる。こうしないほうがいい理由はあるだろうか? 圧縮済み動画の再生にはより多くの処理性能が必要だとは読んだが、今後大きな問題になるかはよく分からない

    • 大きな動画コレクションに自動適用してみたところ、テスト動画では問題なさそうに見えても CRF 設定が弱く、品質が期待以下だった
      元ファイルを消す前に複数の動画を検証せよ、という警告として受け取ればよい
      ただ 300GB ならストレージは十分安いので、そのまま元ファイルを保管してもよい
    • それでも H.264 を選ぶ理由のひとつは、古いハードウェアや低価格帯のハードウェアには H.265 のハードウェアデコードがないことが多いから
      それに Plex でトランスコードなしに使うには、私のホームラボでもそのほうが簡単
  • このガイドはデインターレースフィルタとして yadif を勧めているが、私の目には w3fdif のほうが良く見える
    yadif のようにモーション追跡はしないのでかなり速く、モーション追跡が時々生む目障りなアーティファクトを避けられる
    時には素晴らしく時には悪い結果より、一貫してそこそこの結果のほうが良いと思う
    ただし yadif が2つのフィールドを見るのに対し、w3fdif は一度に3つのフィールドを考慮するため、インターレースのアーティファクトをよりうまく隠せる

    • その拡張版がある: https://github.com/HomeOfVapourSynthEvolution/VapourSynth-Bw...
      どうせ再エンコードするなら、いっそ QTGMC まで使ったほうがよい
    • 前述のように w3fdif はおおむね bwdif に置き換えられた
      w3fdif はきらつき現象を生むことがあるが yadif はそうではないので、bwdif は yadif のように動作しつつ、w3fdif のより優れたフィールドマッチングを使う
    • bwdifyadifw3fdifハイブリッド
  • ffmpeg導入の最大の障壁は、おそらくオフラインのプレミアム型フリーミアムツールやWebフロントエンドだろう
    「avi to mp4」「mp3 to wav」のように、人々がGoogleに普通に入力するフレーズで、サイト側が検索最適化している
    コマンドラインアプリを受け入れるまで思ったより時間がかかったのは、Windowsの世界が「すべてのものにはGUIがあるべき」と教え込んできたからだ

    • そういうファイル変換サイトの大半は、nginxのようなものの上にffmpegを載せた構成だと思っていた
  • ffmpegは複雑だと言われるが、立派なGUIにしてもそれほど簡単にはならない。複雑なのは動画圧縮そのもの
    HandBrakeのようなクリック型インターフェースのように、代わりに判断してくれる方式でない限り、どんなソフトウェアでもこれ以上簡単にはできなさそうだ
    確信はないが、デジタル動画のエンコードと圧縮を十分に細かく学べば、ffmpegで何をすべきかもかなり直感的に感じられるようになる気がする。実際にそうした人はいるのだろうか?

    • 17年ほど前にWindows Mobile向けのDirectShowフィルターを書いたことがあるので、コーデックとコンテナについてはかなり理解している
      当時はmkvのような形式やHEVCのようなコーデックはなかったが、複数のフィルターを通してオーディオ/ビデオを操作するという概念は優れていて、ほとんどのA/V変換ソフトウェアはそのように動作する
      FFmpegのマニュアルページを読み始めるとつながりが見えてきて、1日ほど触った後には使えるようになった
      コマンドラインが好きでmanページを読むタイプなので、それが有利に働いたのかもしれない
  • ffmpegは強力なのでよく使うが、API構造が頭に入ってこない。LLMフロントエンドがあるとよさそうだ

    • APIは自分の頭にもなかなか入ってこないが、たいていはhttps://ffmpeg.org/ffmpeg-all.htmlでgrepしてみると必要なオプションを見つけられる
  • 良いアイデアだ。FFmpegでやりたいことをさせるのはいつも気が重い
    ChatGPTは役に立ったが、完璧ではなかった

    • ChatGPTのおかげで、多くのコマンドラインツールの引数やオプションが使いやすくなった
      OpenSSLのオプションや引数を覚えるのはいつも大変だったが、今では単にGPTを使っている
    • ChatGPTのおかげで、ffmpegは本当にとっつきやすくなった
      ただし、OSごとの微妙な違いが小さな問題として残っている