ffmpeg で MPEG-DASH を扱う

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

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

公式のガイドライン :
GitHub – unifiedstreaming/fmp4-ingest
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

dashの読み込み時の設定がDemuxersのほうで、da9a6d5から-decryption_keys key=value形式の辞書型のキーから復号できる。
avformat/mov: add support for multiple decryption keys · FFmpeg/FFmpeg@da9a6d5 · GitHub

公式ドキュメント:FFmpeg Formats Documentation : dash(Demuxers)
公式ドキュメント: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

Netflixが使っている動きの評価に使われている VMAF(Video Multimethod Assessment Fusion)のモーションスコアを計算する。シーンチェンジ検出のscdetフィルタと似た傾向になるのでシーンチェンジを調べるならscdetフィルタの方が速い。アルゴリズムは平滑化から前フレームとの絶対差平均で、低周波寄りのフレーム変化量を調べている。同じように動きを見るsitiフィルタよりは速い。

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

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

Changelog: update release version 3.4.1 – ffmpeg.git/commitdiff

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

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

github.com – RELEASE_NOTES

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)を扱う

矩形部分の YUV, RGB の値を表示する pixscope

ffmpeg 3.4 から追加のフィルタ。矩形部分の YUV, RGB の平均値と最小値、最大値、RMS と矩形の拡大も表示されるpixscopeフィルタの使い方。

基本コマンド

映像中央の縦横7ピクセルを調べて、統計グラフを右下に表示する
ffmpeg -i input -vf pixscope=x=0.5:y=0.5:w=7:h=7:o=0.5:wx=-1:wy=-1 output
ffmpeg -i input -vf pixscope=0.5:0.5:7:7:0.5:-1:-1 output
ffplay -i input -vf pixscope=0.5:0.5:7:7:0.5:-1:-1

pixscope フィルタの表示例

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

Continue reading “矩形部分の YUV, RGB の値を表示する pixscope”

フリッカー(ちらつき) を低減する deflicker

ffmpeg 3.4 から追加のフィルタ。蛍光灯や昔の映像で数フレーム毎に明るくなったり暗くなったりするのを前後フレームから平均してちらつきを抑えるdeflickerフィルタの使い方。

基本コマンド

5フレーム前から輝度の平均が始まる
ffmpeg -i input -vf deflicker=s=5:m=0:bypass=0 output
ffplay -i input -vf deflicker=5:0:0

小数点以下3桁までで丸めるのでs=2:m=6を併用してsignalstatsフィルタの6桁よりログサイズを小さくするのにも使える。
ffprobe -v error -f lavfi -i movie=iput.mp4,deflicker=2:6:1,signalstats -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.deflicker.luminance,lavfi.signalstats.YAVG -of csv=print_section=0 > deflicker.luminance.csv

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

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

Continue reading “フリッカー(ちらつき) を低減する deflicker”