Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 310 articles
Browse latest View live

HDRにかかわるmkvmergeの設定

$
0
0

VP9でエンコードしたときにつけるHDRメタデータをmkvmergeでつける。指定する値は元の映像と同じ値を指定する。libx265は-x265-paramsから直接指定できる。

オプションは--foo 0:bar形式で、最初の数字は何番目の映像ストリームかの指定。

オプション名 入力値 mediainfo 備考
colour-range 1 Limited リミテッドレンジ
colour-primaries 9 BT.2020 色域
colour-transfer-characteristics 16:PQ, 18:HLG PQ or HLG 伝達関数
colour-matrix 9 BT.2020 non-constant マトリックス
chromaticity-coordinates 任意 Mastering display color primaries
white-colour-coordinates 任意 Mastering display color primaries ホワイトポイント
min-luminance 0 ~ 1000 Mastering display luminance
max-luminance 0 ~ 1000 Mastering display luminance
max-content-light 0 ~ 1000 Maximum Content Light Level MaxCLL
max-frame-light 0 ~ 1000 Maximum Frame-Average Light Level MaxFALL

HDR10のPQのとき。
mkvmerge -o output.mkv --colour-range 0:1 --colour-primaries 0:9 --colour-transfer-characteristics 0:16 --colour-matrix 0:9 --chromaticity-coordinates 0:0.680,0.320,0.265,0.690,0.150,0.060 --white-colour-coordinates 0:0.3127,0.3290 --min-luminance 0:0.0001 --max-luminance 0:1000 --max-content-light 0:1000 --max-frame-light 0:600 input.webm

HLGのときは--colour-transfer-characteristics 0:18に変更する。

ホワイトポイントの指定。

  • P3D65 (Display)
    --white-colour-coordinates 0:0.3127,0.3290
  • P3-DCI (Theater)
    --white-colour-coordinates 0:0.314,0.351
  • P3-D60 (ACES Cinema)
    --white-colour-coordinates 0:0.32168,0.33767

DCI-P3 – Wikipedia

mediainfoではなくffmpegからHDRメタデータの値を調べるには、ffprobeからside_dataを取得する。数値は少数ではなくmkvmergeが読めない分数なので適宜変換する。

ffprobe "input" -show_streams -select_streams v:0 -read_intervals "%+#10" -show_frames -show_entries side_data -v quiet -pretty -print_format json -of json > output.json

ffprobe の使い方

The post HDRにかかわるmkvmergeの設定 first appeared on ニコラボ.

Zeranoe ffmpeg、9月18日に閉鎖へ

$
0
0

FFmpeg Builds – Zeranoe

ffmpeg.zeranoe.com will close on Sep 18, 2020, and all builds will be removed. If you’re using Zeranoe FFmpeg Builds in your product, please ensure that you have a hosting strategy in place by the 18th. Thank you to everyone who supported the project along the way!

WindowsとmacOSのffmpegを配布しているffmpeg.zeranoe.comは過去のアーカイブも削除して2020年9月18日に閉鎖する。これに対して個人でffmpegを用意するにはビルドスクリプトを使う方法がある。

FFmpeg useful links : ffmpegより、

Target: Windows
Host: Windows native; MSYS2/MinGW
https://github.com/jb-alvarado/media-autobuild_suite

Target: Windows
Host: Linux cross-compile –or– Windows Cgywin
https://github.com/rdp/ffmpeg-windows-build-helpers

Target: OS X or Linux
Host: same as target OS
https://github.com/markus-perl/ffmpeg-build-script

一方で配布を受け継ぐ人も現れる。

ffmpeg.zeranoe.com will close on Sep 18, 2020 : ffmpegより、

If someone can provide hosting space, I can provide 64-bit static Windows builds twice a week, starting the 18th.

ドキュメントのコミッターで有名なGyan氏が配布場所の提供があれば18日から週に2回にWinodwsの64bit用の静的ビルドを配布できると。どれくらい帯域が必要だろうか。この界隈で外国にも利用者の多いrigaya氏のサイトを見るとdropboxとonedriveを併用している。Devの開発用と、Sharedの動的リンク、32bit用のffmpegは言及されていないので前もって保存しておくのがよさそう。

rigayaの日記兼メモ帳

メーリングリストなどで同様のやりとりがある。
FFmpeg-users – builds for Windows – archive.org
Win64 static and shared builds : ffmpeg

2020年9月16日からGyan氏はFFmpegの配布を開始した。
FFmpeg Builds – gyan.dev

The post Zeranoe ffmpeg、9月18日に閉鎖へ first appeared on ニコラボ.

2つの映像の差の絶対値の合計平均を調べるmsad

$
0
0

ffmpeg 4.4から使える予定のフィルタ。2つの映像は同じ解像度、ピクセルフォーマットでなければならない。メタデータに出力できるのでffprobe連携しやすい。
ffprobe の使い方

framesyncに対応しているので片方の出力が終わったら終了するようにできる。
2ファイル入力するフィルタの挙動設定 framesync

基本コマンド

オプション設定はなし。出力値は0から1までの小数。変化が少ないほど0に近づく。
ffmpeg -i 調べたい動画 -i 元の動画 -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref=flags=bicubic,msad=shortest=1:repeatlast=0" -an -f null -

公式ドキュメント:FFmpeg Filters Documentation : msad

メタデータ出力内容。

  • lavfi.msad.msad.Y
  • lavfi.msad.msad.U
  • lavfi.msad.msad.V
  • lavfi.msad.msad_avg

ffprobe連携例。出力時間は-read_intervalsで指定。
ffprobe -f lavfi -i movie=enc.mp4,settb=1/AVTB,setpts=PTS-STARTPTS[0];movie=orig.mp4,settb=1/AVTB,setpts=PTS-STARTPTS[1];[0][1]scale2ref=flags=bicubic,msad -show_entries packet_tags=lavfi.msad.msad_avg -read_intervals "%1" > msad_avg.txt

The post 2つの映像の差の絶対値の合計平均を調べるmsad first appeared on ニコラボ.

フィルタ内で分割するsegment、asegment

$
0
0

ffmpeg 4.5から使える予定のフィルタ。いままではselect、aselectフィルタで複数の区間をフィルタ内で分割できたのがより直感的に分割できるようになった。タイムライン編集が使えないフィルタを使ったり、エンコードパラメータを複数使い分けて1つのファイルに戻すなどに使う。

特定の映像フレームや音声サンプルを出力するselect, aselect

Tがあればタイムライン編集に対応している。
ffmpeg -filters : gist.github.com

基本コマンド

最初から90秒まで、90秒から180秒まで、180秒から最後まで分割出力する。setpts、asetptsフィルタを使いPTSをリセットする。
ffmpeg -i input -filter_complex "segment=90|180[0v][1v][2v];[1v]setpts=PTS-STARTPTS[1v];[2v]setpts=PTS-STARTPTS[2v];asegment=90|180[0a][1a][2a];[1a]asetpts=PTS-STARTPTS[1a];[2a]asetpts=PTS-STARTPTS[2a]" -map [0v] -map [0a] output1.mp4 -map [1v] -map [1a] output2.mp4 -map [2v] -map [2a] output3.mp4

タイムライン編集が使えないaddroiフィルタを使い、区間ごとに品質を変更する。
ffmpeg -i input -filter_complex "segment=90|180[0v][1v][2v];[1v]addroi=0:0:iw:ih:-2/51,setpts=PTS-STARTPTS[1v];[2v]addroi=0:0:iw:ih:2/51,setpts=PTS-STARTPTS[2v];[0v][1v][2v]concat=n=3:v=1:a=0" -c:v libx264 -crf 23 -c:a copy output.mp4

秒指定ではなくhh:mm:ss形式はシングルクォートで挟みエスケープする。
ffmpeg -i input -filter_complex "segment='00\:01\:00|00\:01\:30'[0v][1v][2v];[1v]addroi=0:0:iw:ih:-2/51,setpts=PTS-STARTPTS[1v];[2v]addroi=0:0:iw:ih:2/51,setpts=PTS-STARTPTS[2v];[0v][1v][2v]concat=n=3:v=1:a=0" -c:v libx264 -crf 23 -c:a copy output.mp4

concatフィルタで連結せずに分割のままエンコードパラメータを変更してx264のstitchableを有効にしてエンコードし、改めて1つのファイルにconcatする方法もある。この場合はsegmentmuxerで分割しても同じことができる。2番目以降のエンコードパラメータ部分のあるmdatをbsfフィルタで消すことでバイナリを少し小さくできる。音声を分割出力すると後で連結したときに分割部分が瞬間的に途切れることがあるのでconcatで連結して出力する。

詳細な分割設定ができる Segment

ffmpeg -i input -filter_complex "segment=90|180[0v][1v][2v];[1v]setpts=PTS-STARTPTS[1v];[2v]setpts=PTS-STARTPTS[2v];asegment=90|180[0a][1a][2a];[1a]asetpts=PTS-STARTPTS[1a];[2a]asetpts=PTS-STARTPTS[2a];[0a][1a][2a]concat=n=3:v=0:a=1[a]" -map [0v] -crf 23 -x264-params stitchable=1 output1.mp4 -map [1v] -crf 20 -x264-params stitchable=1 -bsf:v filter_units=remove_types=6 output2.mp4 -map [2v] -crf 27 -x264-params stitchable=1 -bsf:v filter_units=remove_types=6 output3.mp4 -map [a] audio.m4a

concat.txt
file output1.mp4
file output2.mp4
file output3.mp4

分割部分が一定間隔でないとfpsがおかしくなることがあるのでbsfフィルタでフレームレートを改めて指定する。
ffmpeg -f concat -safe 0 -i concat.txt -i audio.m4a -bsf:v setts=ts=N/((24/1.001)*TB) -c copy output.mp4

公式ドキュメント:FFmpeg Filters Documentation : segment, asegment

オプション

|毎に分割する時間を指定し、指定数プラス1が出力数になる。時間指定のほかに映像はフレーム指定、音声はサンプル指定ができる。各数値の接頭辞に+をつけると前の分割位置からの相対位置指定になる。

  • timestamps[string]
    時間指定。秒指定と、hh:mm:ss指定ができる。hh:mm:ss形式はシングルクォートで挟みエスケープする
  • frames[string]
    フレーム指定。segmentフィルタで使える
  • samples[string]
    サンプル指定。asegmentフィルタで使える
The post フィルタ内で分割するsegment、asegment first appeared on ニコラボ.

オーディオフレームサイズを指定するasetnsamples

$
0
0

通常はコーデック毎やエンコーダ毎にサンプル数が異なるがこれを任意の値に指定できるasetnsamplesフィルタの使い方。映像のフレーム毎の内容を音声と同期させるために使う。

基本コマンド

通常は他の解析関係のフィルタと併用する。以下はastatsフィルタを24000/1001fpsのフレーム数と同じサンプルフレームでログを出力する。
ffmpeg -i input -af asetnsamples=2002,astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=RMS_level.txt -f null -
ffprobe -v error -f lavfi -i amovie=input.mp4,asetnsamples=2002,astats=metadata=1 -show_entries packet_tags=lavfi.astats.Overall.RMS_level -of csv > output.csv
ffprobe -v error -f lavfi -i amovie=input.mp4,asetnsamples=2002,astats=metadata=1 -show_entries packet_tags=lavfi.astats.Overall.RMS_level -of csv | grep packet - > output.csv

公式ドキュメント:FFmpeg Filters Documentation : asetnsamples

オプション

  • nb_out_samples, n[int]
    音声コーデックの音声1フレームあたりのサンプル数の指定。既定値はコーデック毎の既定値になる。整数、分数、小数どれでも可能
  • pad, p[boolean]
    サンプルレートがnb_out_samples, nで指定した値で割りきれないときに最後のサンプル数を0で埋めて同じ数にする
    既定値:1

コーデック毎のサンプル数を調べる方法
ffprobe -v error -i input.mp4 -select_streams a:0 -show_entries packet=duration -read_intervals "%+#1" -of csv=p=0

動画のフレーム数に合わせたサンプル数の調べ方。

サンプルレート/fps
48000/(24000/1001) = 2002
48000/25 = 1920
48000/(30000/1001) = 1601.6
48000/(60000/1001) = 800.8

44100/(24000/1001) = 1839.3375
44100/25 = 1920 = 1764
44100/(30000/1001) = 1471.47
44100/(60000/1001) = 735.735
The post オーディオフレームサイズを指定するasetnsamples first appeared on ニコラボ.

各チャンネルのピクセル値を反転するnegate

$
0
0

8ビットなら255を0に反転させるnegateフィルタの使い方。lutフィルタでも同様のことができる。タイムライン編集と高ビット深度に対応。

Windows の ffmpeg で生放送する方法 – LUT(ルックアップテーブル、ラット)

基本コマンド

各チャンネルを反転させる。
ffmpeg -i input -vf negate=negate_alpha=0 -c:a copy output.mp4
ffplay -i input -vf negate

lutフィルタで同じ効果。
ffmpeg -i input -vf lut=negval:negval:negval -c:a copy output.mp4
ffplay -i input -vf lut=negval:negval:negval

2回フィルタを当てると元に戻る。
ffplay -i input -vf negate,negate

公式ドキュメント:FFmpeg Filters Documentation : negate

オプション

negate_alpha[boolean]
アルファチャンネルも反転する
既定値:0(反転しない)

The post 各チャンネルのピクセル値を反転するnegate first appeared on ニコラボ.

映像のエントロピーを調べるentropy

$
0
0

各フレームのカラーチャンネルのヒストグラムにおけるグレーレベルのエントロピーを測定するentropyフィルタの使い方。各チャンネルのピクセル値の不規則性を調べる。スコアが高いとより複雑な映像になる。ほかにYUVのピクセル値の統計をログで出力するにはsignalstatsフィルタがある。

YUV のデータを数値で表示する signalstats

基本コマンド

コンソールにnormal、diffモードでログを流す。
ffmpeg -i input -vf entropy=mode=normal,metadata=mode=print:file=- -an -f null -
ffmpeg -i input -vf entropy=mode=diff,metadata=mode=print:file=- -an -f null -

再生しながらentropy.entropy.normal.Yをコンソールに流す。
ffplay input -vf entropy,metadata=print:key=lavfi.entropy.entropy.normal.Y

drawtextフィルタで映像にスコアを描写する。
ffplay input -vf entropy,drawtext=y=40:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"entropy.normal.Y ("%{metadata\:lavfi.entropy.entropy.normal.Y})'

文字を描写する drawtext

drawgraphフィルタで映像の下にスコアを描写する。sで入力した映像と同じ幅を指定する。
ffplay -i input -vf split[0],entropy,drawgraph=lavfi.entropy.normalized_entropy.normal.Y:min=0:max=1:s=1920x256[1];[0][1]vstack

メタデータを映像化する drawgraph, adrawgraph

ffprobeでログを出力する。適宜必要なデータだけをpacket_tagsに指定する。
ffprobe -v error -f lavfi -i movie=input.mp4,entropy -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.entropy.entropy.normal.Y,lavfi.entropy.normalized_entropy.normal.Y,lavfi.entropy.entropy.normal.U,lavfi.entropy.normalized_entropy.normal.U,lavfi.entropy.entropy.normal.V,lavfi.entropy.normalized_entropy.normal.V -of csv > entropy.csv
ffprobe -v error -f lavfi -i movie=input.mp4,entropy=1 -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.entropy.entropy.diff.Y,lavfi.entropy.normalized_entropy.diff.Y,lavfi.entropy.entropy.diff.U,lavfi.entropy.normalized_entropy.diff.U,lavfi.entropy.entropy.diff.V,lavfi.entropy.normalized_entropy.diff.V -of csv > entropy-diff.csv

side_dataの行が不要ならgrepで削る。
ffprobe -v error -f lavfi -i movie=input.mp4,entropy -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.entropy.entropy.normal.Y,lavfi.entropy.normalized_entropy.normal.Y,lavfi.entropy.entropy.normal.U,lavfi.entropy.normalized_entropy.normal.U,lavfi.entropy.entropy.normal.V,lavfi.entropy.normalized_entropy.normal.V -of csv | grep packet - > entropy.csv
ffprobe -v error -f lavfi -i movie=input.mp4,entropy=1 -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.entropy.entropy.diff.Y,lavfi.entropy.normalized_entropy.diff.Y,lavfi.entropy.entropy.diff.U,lavfi.entropy.normalized_entropy.diff.U,lavfi.entropy.entropy.diff.V,lavfi.entropy.normalized_entropy.diff.V -of csv | grep packet - > entropy-diff.csv

ffprobe の使い方

公式ドキュメント:FFmpeg Filters Documentation : entropy

オプション

  • mode[int]
    • normal,0:通常。既定値
    • diff,1:隣接するヒストグラム値間の絶対値の差を測定する

normalized_entropyは通常の値を0から1までに正規化して読みやすくなっている。

normalで使えるメタデータ。YUVのほかにBRGも調べられる。

lavfi.entropy.entropy.normal.[YUVBRG]
lavfi.entropy.normalized_entropy.normal.[YUVBRG]

diffで使えるメタデータ。

lavfi.entropy.entropy.diff.[YUVBRG]
lavfi.entropy.normalized_entropy.diff.[YUVBRG]
The post 映像のエントロピーを調べるentropy first appeared on ニコラボ.

PIDをトラックIDとしてMP4コンテナにつける


エッジ検出フィルタscharr

$
0
0

ffmpeg 4.5でリリース予定のビデオフィルタ。sobelprewittrobertsはカーネルが少し異なるがオプションは同じである。

基本コマンド

ffmpeg -i input -vf scharr=planes=15:scale=1:delta=0 output
ffmpeg -i input -vf scharr=15:1:0 output
ffplay -i input -vf scharr=15:1:0

公式ドキュメント:FFmpeg Filters Documentation : scharr

オプション

sobelprewittrobertsフィルタのオプションと同じ。

  • planes[int]
    フィルタを当てるチャンネル指定
    背景黒とエッジに色をつけるには Y だけに当てる 1 を指定する
    詳しくはffmpeg について | チャンネルの順番と注意点を参照
    既定値:15(すべてのチャンネル)
    範囲:0 から 15 まで
  • scale[float]
    フィルタを当てる乗算値の指定
    既定値:1
    範囲:0 から 65535 まで
  • delta[float]
    フィルタを当てる加算値の指定
    既定値:0
    範囲:-65535 から 65535 まで

サンプル画像

アニメ画像

アニメ「艦隊これくしょん~艦これ~」の11話の大和出撃のシーン

アニメ画像 scharr=1(1st plane だけフィルタを当てている)

実写画像

実物大の戦艦大和

実写画像 scharr=1(1st plane だけフィルタを当てている)

The post エッジ検出フィルタscharr first appeared on ニコラボ.

file宣言が不要なプロトコルconcatf

$
0
0

ffmpeg 4.5から使える予定のプロトコル。demuxerのconcatでつけている-f concat -safe 0や連結ファイルをまとめて記述したテキストのファイルの前に指定するfileも不要に連結できる。

concat を使い分ける

基本コマンド

ffmpeg -i concatf:split.txt -c copy output
ffplay -i concatf:split.txt

ファイル毎に改行し、split.txtで使う特殊文字はバックスラッシュの\かシングルクオートのでエスケープする。

input.mp4
video/input.mp4

'C:\Users\owner\Desktop\input.mp4'
C:/Users/owner/Desktop/input.mp4

公式ドキュメント:FFmpeg Protocols Documentation : concatf

The post file宣言が不要なプロトコルconcatf first appeared on ニコラボ.

ffmpeg 5.0リリース

$
0
0

2022年1月15日に ffmpeg 5.0 Desitter(ウィレム・ド・ジッター)がリリースされた。今回のリリースはメジャーアップデートとなり、4.4以降に追加された新機能の中からマスターにしか追加されていなかったフィルタやエンコーダ、デコーダ等の新機能が全て取り込まれた。

気になる新機能はハードウェア支援を受けて多様なフィルタが使えるlibplaceboフィルタ、MacOS向けのVideoToolbox ProResエンコーダ、scaleフィルタ、-sオプションのslice threading対応、フィルタ内でファイル分割するsegmentフィルタなど。リリースノートにない部分ではDolby Vision RPUパース対応と、showinfoフィルタのHDRサイドデータ表示-readrateオプションで読み込み速度を任意に制限できる。

ffmpeg でダウンロード速度を制限する

前回記事:ffmpeg 4.4 リリース

4.4以降に取り込まれた機能の一覧:
Changelog 4.4 to 5.0 < git.videolan.org Git

「AV1 Low overhead bitstream format muxer」はコンテナ(.obu)形式が使える。分割エンコード向けの機能で最後に連結するときにsettsビットストリームフィルタで任意のフレームレートを指定する。

ffmpeg -f lavfi -i testsrc2=d=1:r=24/1.001 -c:v libaom-av1 tmp.obu
ffmpeg -f concat -safe 0 -i concat.txt -c copy -bsf:v setts=ts=N/((24/1.001)*TB) output.mp4

【ffmpeg】動画・音声を連結する concat の使い方 其の3

記事にしている新機能。

colorspectrumソースはグラデーションのテストソース:
ffmpeg で使える映像のテストソース

読みやすい一覧:
FFmpeg 5.0 Released For This Popular, Open-Source Multimedia Library – Phoronix Forums

Decoders:
– ADPCM IMA Acorn Replay decoder
– GEM Raster image decoder
– MSN Siren decoder
– speex decoder

Demuxers:
– Argonaut Games CVG demuxer
– IMF demuxer (experimental)

Encoders:
– ADPCM IMA Westwood encoder
– Apple Graphics (SMC) encoder
– bitpacked encoder
– VideoToolbox ProRes encoder

A/V filters:
– adecorrelate audio filter
– adynamicequalizer audio filter
– adynamicsmooth audio filter
– afwtdn audio filter
– anlmf audio filter
– apsyclip audio filter
– asdr audio filter
– aspectralstats audio filter
– atilt audio filter

– colorspectrum source video filter

– grayworld video filter
– huesaturation video filter
– libplacebo filter
– limitdiff video filter
– morpho video filter
– (a)latency filters
– audio and video segment filters
– scharr video filter
– hsvkey and hsvhold video filters
– vflip_vulkan, hflip_vulkan and flip_vulkan filters
– varblur video filter
– xcorrelate video filter
– yadif_videotoolbox filter

HW accel:
– VideoToolbox ProRes hwaccel
– VideoToolbox VP9 hwaccel

Muxers:
– Argonaut Games CVG muxer
– AV1 Low overhead bitstream format muxer
– Westwood AUD muxer

Misc:
– RTP packetizer for uncompressed video (RFC 4175)
– support loongarch.
– amr parser
– Concatf protocol
– swscale slice threading

The post ffmpeg 5.0リリース first appeared on ニコラボ.

vlukanのハードウェア支援を受けた汎用フィルタlibplacebo

$
0
0

リサイズ、デバンディング、トーンマッピング、色相調整などができる外部ライブラリのlibplaceboフィルタの使い方。パラメータが多いので一部を抜粋。

haasn/libplacebo: Official mirror of libplacebo

基本コマンド

ハードウェア支援なくデコードしてyuv420p形式にリサイズする。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=1280:720:yuv420p,hwdownload,format=yuv420p" -c:v libx264 -c:a copy output

NvidiaのGPUがあればデコード支援に使い、こちらの方が速い。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=1280:720:nv12,hwupload_cuda" -c:v hevc_nvenc -c:a copy output

10ビット深度でリサイズする。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=1280:720:p010le,hwupload_cuda" -c:v hevc_nvenc -pix_tmt p010le -c:a copy output

cuda – Understanding pixel format and profile when encoding 10-bit video in ffmpeg with nvenc – Super User

HDRからSDRにトーンマッピングする。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=format=gbrpf32le:color_trc=linear:tonemapping=mobius,libplacebo=format=nv12:colorspace=bt709:color_primaries=bt709:color_trc=bt709,hwupload_cuda" -c:v hevc_nvenc -c:a copy output

mpvのhook shadersを使う。glsl形式は読めない。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,libplacebo=custom_shader_path='C\:/Users/owner/AppData/Roaming/mpv.net/shaders/NoChroma.hook',hwupload_cuda" -c:v hevc_nvenc -c:a copy output

bShaders/NoChroma.hook at master · butterw/bShaders
Video player Shaders guide (MPC-HC, mpv) – Doom9’s Forum

公式ドキュメントはまだない。

オプション

ffmpeg -h filter=libplaceboで見られるパラメータ一覧。

以下抜粋。
リサイズアルゴリズムの指定。libplacebo/filters.c · haasn/libplaceboより。

  • upscaler[string]
  • downscaler[string]
    • triangle
    • gaussian
    • sinc
    • catmull_rom
    • mitchell
    • robidoux
    • robidouxsharp
    • bicubic
    • spline16
    • spline36
    • spline64
The post vlukanのハードウェア支援を受けた汎用フィルタlibplacebo first appeared on ニコラボ.

色補正フィルタのgrayworld

$
0
0

異なる伝達関数に変換するときに使い、事前に線形変換が必要。ピクセルフォーマットはgbrpf32leになるので負荷はかなり大きい。

論文:https://www.researchgate.net/publication/275213614_A_New_Color_Correction_Method_for_Underwater_Imaging

基本コマンド

オプション指定は無い。
ffmpeg -i input -vf zscale=t=linear,grayworld,zscale=t=bt709,format=yuv420p -c:a copy output

異なるトーンマッピングするとき、つまりHDRからSDR変換などの用途が考えられる。
ffmpeg -i input -vf zscale=t=linear,grayworld,tonemap=clip:param=1.0,zscale=p=bt709:t=bt709:m=bt709,format=yuv420p -c:a copy output

Zライブラリを使ったリサイズフィルタ zscale
異なるダイナミックレンジにトーンマッピングするtonemap

公式ドキュメント:FFmpeg Filters Documentation : grayworld

The post 色補正フィルタのgrayworld first appeared on ニコラボ.

ピッチを任意の周波数に変更するasetrate

$
0
0

入力した音声のサンプリング周波数より高ければ高音に、低ければ低音に変える。出力周波数は変更した周波数に変わるのでオプションの-arか、aresampleフィルタで目的の周波数に変更する。

ピッチ変更はrubberbandフィルタでもできる。
サンプリング周波数を変えずにテンポとピッチを変える rubberband

基本コマンド

ffmpeg -i input -af asetrate=24000,aresample=48000 -c:v copy output
ffmpeg -i input -af asetrate=24000 -c:v copy -ar 48000 output

オプション

  • sample_rate, r[int]
    サンプルレートの指定
    既定値:44100
    範囲:1からINT_MAXまで

公式ドキュメント:FFmpeg Filters Documentation : asetrate

The post ピッチを任意の周波数に変更するasetrate first appeared on ニコラボ.

低域を減退させるhighpassと広域を減退させるlowpass

$
0
0

3dBポイントの周波数でフィルタを適用する。フィルターは単極、または両極のいずれかが選択できる。フィルタのロールオフ(減衰傾度)は、1オクターブあたり6dB/極になる。周波数毎に無音にするにはsuperequalizerフィルタなどを使う。

基本コマンド

ffmpeg -i input -af highpass=3000 -c:v copy output
ffmpeg -i input -af lowpass=500 -c:v copy output
ffplay -i input -af highpass=3000,lowpass=500

LFEチャンネルだけにlowpassフィルタを当てる。
ffmpeg -i input -af lowpass=c=LFE -c:v copy output

公式ドキュメント:FFmpeg Filters Documentation : highpass
公式ドキュメント:FFmpeg Filters Documentation : lowpass

オプション

  • frequency, f[double]
    パスする周波数Hzの指定。highpassならばその上をパスして下を減退。lowpassならばその下をパスして上を減退。
    既定値:3000(highpass)
    既定値:500(lowpass)
    範囲:0から999999まで
  • width_type, t[int]
    widthで指定する単位
    • 1, h:Hz
    • 2, o:octave
    • 3, q:Q-Factor。既定値
    • 4, s:slope
    • 5, k:kHz
  • width, w[double]
    frequencyの帯域幅の指定
    既定値:0.707
    範囲:0から99999まで
  • poles. p[int]
    極数の指定
    既定値:2
    範囲:1(単極)と2(両極)
  • mix, m[double]
    数値が小さいほどフィルタの効果がなくなる
    既定値:1
    範囲:0から1まで
  • channels, c[channel_layout]
    フィルタを当てるチャンネルの指定。個別のチャンネルにフィルタを当てるなら|で分けて複数指定する。|は特殊文字なのでフィルタ全体をではさむ
    16進数の指定方法より個別のチャンネル名の方がわかりやすい
    既定値:0xffffffffffffffff(すべてのチャンネル)
  • normalize, n[boolean]
    DC応答の大きさを0dBに正規化する
    既定値:0(正規化しない)
  • transform. a[int]
    transformタイプの指定
    • 0, di:direct form I。既定値
    • 1, dii:direct form II
    • 2, tdii:transposed direct form II
    • 3, latt:lattice-ladder form
    • 4, svf:state variable filter form
  • precision, r[int]
    精度の指定
    • -1, auto:既定値
    • 0, s16:signed 16-bit
    • 1, s32:signed 32-bit
    • 2, f32:floating-point single
    • 3, f64:floating-point double
The post 低域を減退させるhighpassと広域を減退させるlowpass first appeared on ニコラボ.

音声のノイズ低減フィルタanlmdn

$
0
0

映像のデノイズにもあるNon-Local Meansアルゴリズムを音声のノイズ低減に使う。こちらも処理負荷が高く効果は絶大。

非局所平均のデノイザ nlmeans

基本コマンド

ffmpeg -i input -af anlmdn=s=0.00001:p=0.002:r=0.006:o=1:m=11 -c:v copy output
ffplay -i input -af anlmdn=0.00001:0.002:0.006:1:11

公式ドキュメント:FFmpeg Filters Documentation : anlmdn

オプション

  • strength, s[float]
    ノイズ強度の指定
    既定値:0.00001
    範囲:0.00001から10まで
  • patch, p[duration]
    パッチ時間の指定
    既定値:0.002
  • research, r[duration]
    探索時間の指定。大きい値ほど負荷が重たくなる
    既定値:0.006
  • output, o[int]
    出力モードの指定
    • 0, i:入力のまま。既定値
    • 1, o:フィルタを当てる
    • 2, n:ノイズだけ出力
  • smooth, m[float]
    スムーズファクター値の指定
    既定値:11
    範囲:1から15まで
The post 音声のノイズ低減フィルタanlmdn first appeared on ニコラボ.

映像の変化が少ないシーン区間を調べるfreezedetect

$
0
0

しきい値と検出区間を指定して動きの少ない区間を調べるfreezedetectフィルタの使い方。

基本コマンド

ffmpeg -i input -vf freezedetect=n=0.001:d=2 -an -f null -

ログの出力例。

lavfi.freezedetect.freeze_start: 118.318
lavfi.freezedetect.freeze_duration: 7.34067
lavfi.freezedetect.freeze_end: 125.659

metadataフィルタでログをテキストに出力する。
ffmpeg -i input -vf freezedetect=n=0.001:d=2,metadata=mode=print:key=lavfi.freezedetect.freeze_duration:file=freeze_duration.txt -an -f null -

メタデータをコンソールに表示する metadata, ametadata

flat形式だけは検出されない区間がないので目視しやすい。
ffprobe -v error -f lavfi -i movie=input,freezedetect -select_streams v:0 -show_entries packet_tags=lavfi.freezedetect.freeze_duration -of flat > freeze_duration.txt

ffprobe の使い方

検出されない区間は空データになりログのファイルサイズが大きくなる。
ffprobe -v error -f lavfi -i movie=input,freezedetect -select_streams v:0 -show_entries packet_tags=lavfi.freezedetect.freeze_start,lavfi.freezedetect.freeze_end,lavfi.freezedetect.freeze_duration -of json > freezedetect.json

公式ドキュメント:FFmpeg Filters Documentation : freezedetect

オプション

  • n, noise[double]
    ノイズ許容値の指定
    既定値:0.001
    範囲:0から1まで
  • d, duration[duration]
    検出区間の最小値の指定。この値以上で検出する
    既定値:2

扱えるメタデータ。

lavfi.freezedetect.freeze_start
lavfi.freezedetect.freeze_end
lavfi.freezedetect.freeze_duration
The post 映像の変化が少ないシーン区間を調べるfreezedetect first appeared on ニコラボ.

無音区間を調べるsilencedetect

$
0
0

しきい値と検出区間を指定して無音区間を調べるsilencedetectフィルタの使い方。

基本コマンド

ffmpeg -i input -af silencedetect=n=0.001:d=2:m=0 -vn -f null -

ログの出力例。

silence_start: 0
silence_end: 1.80225 | silence_duration: 1.80225

ametadataフィルタでログをテキストに出力する。
ffmpeg -i input -af silencedetect=n=0.001:d=2:m=0,ametadata=mode=print:key=lavfi.silence_duration:file=silence_duration.txt -vn -f null -

メタデータをコンソールに表示する metadata, ametadata

flat形式だけは検出されない区間がないので目視しやすい。
ffprobe -v error -f lavfi -i amovie=input,silencedetect -select_streams a:0 -show_entries packet_tags=lavfi.silence_duration -of flat > silence_duration.txt

ffprobe の使い方

検出されない区間は空データになりログのファイルサイズが大きくなる。
ffprobe -v error -f lavfi -i amovie=input,silencedetect -select_streams a:0 -show_entries packet_tags=lavfi.silence_start,lavfi.silence_end,lavfi.silence_duration -of json > silencedetect.json

チャンネル毎に調べるにはm=1にして、1開始の添え字を追加する。
ffprobe -v error -f lavfi -i amovie=input,silencedetect=m=1 -select_streams a:0 -show_entries packet_tags=lavfi.silence_duration.1 -of flat > silence_duration.txt

添え字とチャンネルの関係はStandard channel layout compositionsの順番になる。

公式ドキュメント:FFmpeg Filters Documentation : silencedetect

オプション

アニメのOPEDは開始終了に0.5秒の無音が入るので余裕を持ってd=0.45を指定するとその区間以上で検出する。

  • n, noise[double]
    ノイズ許容値の指定
    既定値:0.001
    範囲:0から1まで
  • d, duration[duration]
    検出区間の最小値の指定。この値以上で検出する
    既定値:2
  • m, mono[boolean]
    チャンネル毎に解析する
    既定値:0

扱えるメタデータ。

lavfi.silence_start
lavfi.silence_end
lavfi.silence_duration

チャンネル毎に調べるにはm=1を指定して1開始の添え字を追加する。

lavfi.silence_start.X
lavfi.silence_end.X
lavfi.silence_duration.X
The post 無音区間を調べるsilencedetect first appeared on ニコラボ.

色相を変更できるhuesaturation

$
0
0

RGBベースの色相を変更できるhuesaturationフィルタの使い方。YUVベースはhueフィルタ。タイムライン編集に対応。

色相を動的に変更できる hue
特定の区間だけフィルタを当てるタイムライン編集について

基本コマンド

既定値では変化ない。
ffmpeg -i input -vf huesaturation=hue=0:s=0:intensity=0 output
ffplay -i input -vf huesaturation=0:0:0

公式ドキュメント:FFmpeg Filters Documentation : huesaturation

オプション

  • hue[float]
    色相の角度指定
    既定値:0
    範囲:-180から180まで
  • saturation[float]
    彩度のシフト指定
    既定値:0
    範囲:-1から1まで
  • intensity[float]
    強度のシフト指定
    既定値:0
    範囲:-1から1まで
  • colors[flags]
    シフトする色の指定。複数指定するときは+でつなげる
    既定値:”r+y+g+c+b+m+a”
    • r:赤
    • y:黄
    • g:緑
    • c:シアン(水色に近い青緑)
    • b:青
    • m:マゼンタ(明るく鮮やかな赤紫)
    • a:全部
  • strength[float]
    フィルタ強度の指定
    既定値:1
    範囲:0から100まで
  • rw[float]
    赤の比重指定
    既定値:0.333
    範囲:0から1まで
  • gw[float]
    緑の比重指定
    既定値:0.333
    範囲:0から1まで
  • bw[float]
    青の比重指定
    既定値:0.333
    範囲:0から1まで
  • lightness[boolean]
    明るさを保持する
    既定値:0
The post 色相を変更できるhuesaturation first appeared on ニコラボ.

フォーマット変換するformat、aformat

$
0
0

ピクセルフォーマットを変換するformatフィルタと、サンプルフォーマットとサンプルレートを変換するaformatフィルタの使い方。

format

指定されたピクセルフォーマットのいずれかに変換し、複数指定したときは適切なものを選びアップサンプリングはしない。ビット深度は同じもの、RGBからYUV変換するときはサブサンプリングが一番大きなもの、ビット深度とサブサンプリングではビット深度が高いものを優先して選ぶ。

基本コマンド

ffmpeg -i input -vf "format=yuv420p|yuv422p|yuv444p|yuv420p10le" -c:a copy output

BGR(RGBではない)からYUVに変換するときはscaleフィルタのフラグにaccurate_rndをつける。
ffmpeg -i bgr_input -vf "format=yuv420p|yuv422p|yuv444p|yuv420p10le,scale=flags=accurate_rnd" -c:a copy output

ffmpegのwiki:Scaling – FFmpeg
公式ドキュメント:FFmpeg Filters Documentation : format

オプション

垂直棒|で複数指定できる。1種類しかオプションがないのでオプション名の宣言は不要。

  • pix_fmts[string]
    ピクセルフォーマットの指定

ピクセルフォーマットは以下のコマンドで調べられる。
ffmpeg -pix_fmts

aformat

指定したサンプルフォーマットとサンプルレートのいずれかに変換し、複数選択すると最適なものを選びアップサンプリングはしない。

サンプルレートの変換にはaresampleフィルタ、レイアウト変更にpan、channelmapフィルタなどがある。

各チャンネルの音声を合わせたり調整する pan
音声のチャンネルレイアウトを変えるchannelmap

基本コマンド

ffmpeg -i input -af "aformat=f=u8|s16|s32:r=44100|48000:cl=stereo" -c:v copy output

公式ドキュメント:FFmpeg Filters Documentation : aformat

オプション

すべて垂直棒|で複数指定できる。

  • sample_fmts, f[string]
    サンプルフォーマットの指定
  • sample_rates, r[string]
    サンプルレートの指定
  • channel_layouts, cl[string]
    チャンネルレイアウトの指定。指定方法はチャンネルレイアウトの書式に準ずる。

サンプルフォーマットは以下のコマンドで調べられる。
ffmpeg -sample_fmts

pありがplanar、pなしがpacked。

name   depth
u8        8
s16      16
s32      32
flt      32
dbl      64
u8p       8
s16p     16
s32p     32
fltp     32
dblp     64
s64      64
s64p     64

ffmpeg 音声の内部形式の話 – 脳内メモ++

U8, U8P :Unsigned 8bits(符号無し8ビット整数)
S16, S16P :Signed 16bits(符号付き16ビット整数)
S32, S32P :Signed 32bits(符号付き32ビット整数)
FLT, FLTP :Single-precision floating point(単精度浮動小数点 32bit)
DBL, DBLP :Double-precision floating point(倍精度浮動小数点 64bit)

The post フォーマット変換するformat、aformat first appeared on ニコラボ.
Viewing all 310 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>