複数の映像を任意の割合でミックスする mix

ffmpeg 4.0 で追加されたフィルタ。複数の映像を任意の割合で混ぜ合わせるmixフィルタの使い方。今までは透過チャンネルを使ってoverlayフィルタを使っていたがこれからはもっと手軽に複数の映像を映し出すことが出来る。

1つのファイルで連続するフレームを混ぜるならtmixフィルタがある。
連続フレームの映像を任意の割合でミックスするtmix

似たフィルタにfadeフィルタがある。
フェードイン、フェードアウトの設定ができる fade

基本コマンド

既定値では2入力である。
ffmpeg -i input1 -i input2 -filter_complex mix ouput
ffmpeg -re -i input1 -i input2 -filter_complex mix -f sdl -

testsrc2 の映像

smptebars の映像

testsrc2, smptebars を mix した映像

3入力する場合のコマンド例。
ffmpeg -i input1 -i input2 -i input3 -filter_complex mix=3 ouput
公式ドキュメント:FFmpeg Filters Documentation : mix

Continue reading “複数の映像を任意の割合でミックスする mix”

1フレームに複数のフレームを表示する tile

一つの映像の前後フレームを1フレームに表示し確認できるtileフィルタの使い方。複数並べた映像を元の連続フレームに戻すにはuntileフィルタを使う。

映像を分割し連続フレームにするuntile

3×3のタイルの出力例

基本コマンド

3×3のタイルを-t 3で3秒間の重複のない連続画像を出力する。
ffmpeg -i input -t 3 -vf tile=layout=3x3:nb_frames=0:margin=0:padding=0:color=black:overlap=0:init_padding=0 output-%03d.jpg

キーフレームだけ出力する場合には入力ファイルの前に-skip_frame nokeyをつける。
ffmpeg -skip_frame nokey -i input -t 3 -vf tile=3x3 output-%03d.jpg

ノンリニア編集のように過去5つ前までのフレームを横に表示し、アスペクト比を維持せずに最大横幅が1920ピクセル、縦幅が1080ピクセルまで。
ffplay -i input -vf tile=5x1:overlap=4,scale=1920:1080:force_original_aspect_ratio=decrease

関連記事

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

Continue reading “1フレームに複数のフレームを表示する tile”

ffmpeg で MPEG-DASH を扱う

MP4Boxは使わずにffmpegだけでMPEG-DASHのMPDファイルを作る方法。またffmpeg 3.4からはlibxml2をリンクすることでMPDファイルを読み込むこともできる。各セグメントの.m4sファイルは最初に読み込むinit.mp4を毎回参照し各セグメントの.m4sファイルをデコードしている。

関連記事
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

公式のガイドライン : DASH-IF Live Media Ingest Protocol : web.archive

外部記事

基本コマンド

すべてのセグメントをMPDに記載してコピーする。
ffmpeg -i input.mp4 -c copy -window_size 0 -movflags +faststart output.mpd

1つの映像に1つ目はオリジナルをコピーし、2つめはアスペクト比固定で横解像度は2で割れて、縦解像度360pにリサイズして2つのストリームをリアルタイム-reで出力する。-mapを2度使うことで2出力にしている。
ffmpeg -re -i input.mp4 -map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 -c:v:0 copy -c:a:0 copy -filter:v:1 "scale=-2:360" -c:v:1 libx264 -profile:v:1 main -b:v:1 600k -c:a:1 aac -b:a:1 128k -f dash -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" -movflags +faststart output.mpd

改行しわかりやすくしたもの。

ffmpeg -re -i input.mp4 -map 0 -map 0 -c:v:0 copy -c:a:0 copy 
-filter:v:1 "scale=-2:360" -c:v:1 libx264 -profile:v:1 main -b:v:1 600k -c:a:1 aac -b:a:1 128k 
-f dash -window_size 5 -adaptation_sets "id=0,streams=v id=1,streams=a" 
-movflags +faststart output.mpd

公式ドキュメントには-movflagsを以下に利用している。
-movflags empty_moov+separate_moof+default_base_moof+cmaf

ffmpeg Documentation : mov, mp4, ismv

その他のフラグは以下に利用している。
-fflags genpts -export_side_data prft

ffmpeg Documentation : Format Options
ffmpeg Documentation : Codec Options

公式ドキュメント:FFmpeg Formats Documentation : dash(Muxers)

Continue reading “ffmpeg で MPEG-DASH を扱う”

2017年11月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。2017年8月24日(34週目)からユーザー生放送の新配信での予約延長が無料になり総配信数が減っている。

1枠30分はもはや絶滅危惧種なので来年からは30分枠、6000制限をなくす予定。

Continue reading “2017年11月のニコ生統計”

新しい映像の動きの評価 vmafmotion

2017年12月16日
vmafmotion, libvmafフィルタの意味をはき違えていたのでタイトルと本文を訂正、修正した。

Netflixが使っている品質評価動きの評価に使われている VMAF(Video Multimethod Assessment Fusion)のモーションスコアを計算する。シーンチェンジ検出のscdetフィルタと似た傾向になるのでシーンチェンジを調べるならscdetフィルタの方が速い。

VMAFを計算するフィルタは2つあり、このvmafmotion./configure --enable-libvmafでライブラリをインストールして使えるlibvmafフィルタがある。前者は1つの映像の vmafモーションスコア(映像の変化)を計算し数値が 0 に近いほど前フレームからの変化が少ないことを示す。後者は2つの映像を比較した vmafスコア(品質評価)を計算し、ssim、psnrフィルタよりも見た目の評価(主観的評価)に近しいものを目指している。

そのほかの動きを検出するフィルタ。
シーンチェンジの時間を調べるscdet
特定の映像フレームや音声サンプルを出力するselect, aselect

基本コマンド

vmafモーションスコアを計算しエンコードが終わると平均 vmafモーションスコアをコンソールに表示する
ffmpeg -i input -vf vmafmotion -an -f null -

さらにフレーム毎の vmafモーションスコアを log.txt のテキストファイルで出力する
ffmpeg -i input -vf vmafmotion=log.txt -an -f null -

再生しながらコンソールに表示する。
ffplay input -vf vmafmotion,metadata=print:key=lavfi.vmafmotion.score

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

文字を描写する drawtext

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

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

ffprobeでログを出力する。
ffprobe -v error -f lavfi -i movie=input.mp4,vmafmotion -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.vmafmotion.score -of csv > vmafmotion.csv

side_dataの行が不要ならgrepで削る。
ffprobe -v error -f lavfi -i movie=input.mp4,vmafmotion -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.vmafmotion.score -of csv > vmafmotion.csv

ffprobe の使い方

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

オプション

  • stats_file[string]
    すべてのフレームの vmaf モーションスコアを表示したログファイルを指定したパスに出力する。で標準出力する
    既定値:無指定(何も出力しない)

2017年10月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。2017年8月24日(34週目)からユーザー生放送の新配信での予約延長が無料になり総配信数が減っている。

Continue reading “2017年10月のニコ生統計”

2017年9月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。2017年8月24日(34週目)からユーザー生放送の新配信での予約延長が無料になり総配信数が減っている。

Continue reading “2017年9月のニコ生統計”

ffmpeg 3.4 リリース

2018年2月12日に 3.4.2 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。このバージョンで libx264 の複数深度に対応した。

x264 一つのバイナリで複数のビット深度に対応

Changelog: update release version 3.4.2 – ffmpeg.git/commitdiff
git.videolan.org Git – ffmpeg.git/shortlog : n3.4.2

2017年12月11日に 3.4.1 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。

Changelog: update release version 3.4.1 – ffmpeg.git/commitdiff
git.videolan.org Git – ffmpeg.git/shortlog : n3.4.1

2017年10月16日、ffmpeg 3.4 Cantor(カントル)がリリースされた。3.4 は 3.3 からのメジャーアップデートでこれまでに取り込まれたコミットのすべてが入っている。

前回更新記事:ffmpeg 3.3 リリース

git.ffmpeg.org Git – ffmpeg.git/blob – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog

Continue reading “ffmpeg 3.4 リリース”

ニコ生の非低遅延モードについて

ユーザー生放送新配信HTML5版 非低遅延モードについて|ニコニコインフォ

用途概要

新配信番組は高画質かつ低遅延での視聴が可能となっております。そのためお使いの環境によっては負荷が高まり、映像が途切れる等の現象が起こる可能性がございます。

今回提供を開始いたしました非低遅延モードを選択すると遅延時間は延びてしまう一方で安定した視聴が可能となります。

慢性的に視聴が困難な場合一時的に回線状況が悪い際にご利用いただくことを推奨いたします。

具体的には各セグメント時間が通常の新配信では0.5秒になっているのが、非低遅延モードでは1.0秒になっている。マニフェストに記載してあるセグメント数はどちらも3つなので最低でも普通の新配信は0.5*3の1.5秒。非低遅延モードの新配信は1.0*3の3秒は遅延することになる。

関連記事
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う