【終了】5月26日(木)ニコニコ全体停止メンテナンスについて‐ニコニコインフォ
メンテナンス前後で変わったかどうかはわからないが気づいたところとか。
niconicoとffmpegのことを中心に書いてる
【終了】5月26日(木)ニコニコ全体停止メンテナンスについて‐ニコニコインフォ
メンテナンス前後で変わったかどうかはわからないが気づいたところとか。
入力した映像のフレームをフィールドに分離し足したり引いたりするtinterlace
フィルタの使い方。1入力1出力なので別ソースの同じ映像を取り込む場合は偶数フレームと奇数フレームをインターリーブしてから1映像にすることで2映像の偶数フィールドと奇数フィールドを混ぜることができる。
関連フィルタ:
複数の映像を1つの映像に合わせるinterleave
ピクチャーをインターリーブ、デインターリーブするil
ちなみに偶数フレーム、奇数フレームそれぞれをドロップさせる(間引く)にselect
フィルタがあり、こちらの方が高速。
特定の映像フレームや音声サンプルを出力する select, aselect
説明で使われるフレーム、フィールド番号は 1 スタートの奇数である。
偶数フレームを出力する:select='mod(n-1,2)' // 出力フレームは 0, 2, 4... 奇数フレームを出力する:select='mod(n,2)' // 出力フレームは 1, 3, 5...
集計期間は週間のニコ生統計の4月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
見ての通りハングルが並んでいる新着コミュニティ一覧。過去の新着コミュニティを調べてみると*2015年11月30日の18時14分32秒 2015年11月19日13時6分36秒に設立されたコミュニティが荒らしの始まりのようだ。なぜ開設日時の秒まで調べられるかというと API で調べられるから。
*再度確認したらもっと早かった(訂正:2016年5月15日9時02分)
, 区切りで複数のコミュニティを指定できる
http://api.ce.nicovideo.jp/api/v1/community.array?id=co1,co2(この形式は2021年6月に使えなくなった)
ffmpeg で映像や音声を連結(後ろにつなげる)する方法に concat があるが、concat にも3種類ありそれぞれ使い道が異なるのでそれらの説明。個別の記事は以前に書いているので補足説明を加えた。
まずは連結するファイルのコーデックが同じで、かつ同じ解像度や fps、エンコード設定なら再エンコードしない demuxer, protocol の concat がおすすめ。demuxer, protocol の違いは demuxer のほうが新しい機能で対応コンテナが protocol より柔軟である。filter の concat はフィルタ経由で連結するので再エンコードされるが、リサイズやインターレース解除、デテレシネなどのフィルタを当てたりするのならこちらの方が連結部分がきれいに仕上がりやすい。
公式 wiki:Concatenate – FFmpeg
h.264 – How to concatenate two MP4 files using FFmpeg? – Stack Overflow
Authorization:bearer は firefox の場合、F12 から「開発ツール」を起動して、slotAudience を探して「cURLとしてコピー」したのを見ると Authorization:bearer が載っている。
Authorization:bearer をつけて https://api.abema.io/v1/media?dateFrom=20160423&dateTo=20160430 形式に POST すれば番組表の json が返ってくる。全チャンネルの番組表が返ってくるので複数の日を指定すると容量がとても大きくなる。
大きく分けて channels, channelSchedules, availableDates に分けられ、channels に放送チャンネル一覧、channelSchedules は番組データ、availableDates は取得可能日数になっている。複数日数の場合は channelId が日数分連続するので channelSchedules -> array の順番が大きく変わる。
ffmpeg で Apple HTTP Live Streaming(HLS)形式に出力する方法。各セグメントの動画ファイルは TS(ffmpeg 3.4 からは .m4s(fragmented MP4, fmp4)も可能)でテキスト形式のプレイリストとなるマニフェストは .m3u8 で出力される。またsegment
muxer のオプションを使うことでより詳細な設定ができる。
字幕付きの配信なら
ARIB字幕をVTTにしてHLSで視聴する
MPEG-DASHは以下より
ffmpeg で MPEG-DASH を扱う
Continue reading “ffmpeg で Apple HTTP Live Streaming(HLS)を扱う”
segment
muxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名にはimage2
muxer と同じように連番出力(%d)や、-strftimeオプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hls
muxer のオプションと併用することで詳細に分割設定ができる。
-reset_timestamps 1を付けると2分割以降のファイルの PTS がリセットされて動画投稿サイト向けに分割したファイルの投稿が可能になる。
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法
フィルタ内で分割するなら。
詳細な分割設定ができる Segment
300秒毎にMP4に分割出力する。-flags +global_headerをつけると一部プレイヤーでの再生互換が高まる。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 300 -segment_format_options movflags=+faststart -reset_timestamps 1 out-%02d.mp4
-segment_time 60で60秒ごとにMP4で分割し-segment_list out.csvで分割データを記載したファイルも出力する。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 60 -segment_list out.csv -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
-segment_list out.ffconcatで分割したファイルをまとめたリストを出力する。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_time 60 -segment_list out.ffconcat -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
上のout.ffconcatを読み込んで1つのファイルに戻す。
ffmpeg -i out.ffconcat -c copy -segment_format_options movflags=+faststart output.mp4
-segment_timesで1032, 11414, 11847 の秒時間になったら分割する。つまり4分割される。-reset_timestampsを有効にすると分割ファイル毎の PTS が0秒開始になる。
ffmpeg -i input.mp4 -map 0 -c copy -flags +global_header -f segment -segment_times 1032,11414,11847 -segment_format_options movflags=+faststart -reset_timestamps 1 out-%02d.mp4
-segment_wrap 100で常に最新の100フレームの画像を出力し、それ以外を削除する。
ffmpeg -i input -q:v 3 -f segment -segment_format mjpeg -segment_wrap 100 -segment_time 0.001 out%d.jpg
再エンコードして常にセグメントを固定秒にするにはキーフレーム間隔を強制する。-sc_threshold 0でシーンチェンジによるキーフレーム挿入を0にして、5秒間隔で分割するには-gのkeyintと-force_key_framesでキーフレーム間隔を固定させている。映像は30fpsとして5秒間の150フレームを-gで指定している。
ffmpeg -i input -c:v libx264 -crf 23 -c:a aac -map 0 -segment_time 5 -g 150 -sc_threshold 0 -force_key_frames "expr:gte(t,n_forced*5)" -f segment output%03d.ts
-force_key_framesは2重引用符で挟むのと、カンマの後をバックスラッシュでエスケープしない。これらはエラーになる。
-force_key_frames 'expr:gte(n,n_forced*60)' -force_key_frames "expr:gte(n\,n_forced*60)" -force_key_frames expr:gte(n\,n_forced*60)
秒時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める。
ffmpeg -i input.mp4 -force_key_frames 1,2,3,5,8,13,21 -map 0 -c:v libx264 -c:a aac -flags +global_header -f segment -segment_time 60 -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4
そのほかにカンマ区切りのhh:mm:ss.ms指定ができる。-force_key_frames 00:02:11.000,00:01:11.000
-segment_timeであらかじめ大きな値を指定していれば、1ファイルでも strftime書式が使える。使えるフォーマットは、ffmpeg で Apple HTTP Live Streaming(HLS)を扱う | セグメントファイル名の設定を参照。
ffmpeg -i input -map 0 -c c:v libx264 -c:a aac -f segment -segment_time 99999 -strftime 1 "output-%Y%m%d.ts"
ffmpeg Documentation : force_key_frames
linux – Slicing video file into several segments – Super User
最初のフレームから分割できないときは入力ファイルの前に-ignore_editlist 1をつける
ffmpeg -ignore_editlist 1 -i input.mp4 以下略
The video track has an edit list specifying a truncated track
公式ドキュメント:FFmpeg Formats Documentation : segment, stream_segment, ssegment
集計期間は週間のニコ生統計の3月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
3 x 3、5 x 5または7 x 7(ffmpeg 4.0 以降)のカーネルが指定できるconvolution
(畳み込み)フィルタの使い方。数学的な話はここでは説明しない。