abemaTV の番組表 json

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 の順番が大きく変わる。

Continue reading “abemaTV の番組表 json”

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

ffmpeg で Apple HTTP Live Streaming(HLS)形式に出力する方法。各セグメントの動画ファイルは TS(ffmpeg 3.4 からは .m4s(fragmented MP4, fmp4)も可能)でテキスト形式のプレイリストとなるマニフェストは .m3u8 で出力される。またsegmentmuxer のオプションを使うことでより詳細な設定ができる。

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

字幕付きの配信なら
ARIB字幕をVTTにしてHLSで視聴する

MPEG-DASHは以下より
ffmpeg で MPEG-DASH を扱う

Continue reading “ffmpeg で Apple HTTP Live Streaming(HLS)を扱う”

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

segmentmuxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名にはimage2muxer と同じように連番出力(%d)や、-strftimeオプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hlsmuxer のオプションと併用することで詳細に分割設定ができる。

-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

Continue reading “詳細な分割設定ができる Segment”

2016年3月のニコ生統計

集計期間は週間のニコ生統計の3月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。

Continue reading “2016年3月のニコ生統計”

鮮鋭化やぼかし、エンボス処理などができる convolution

3 x 3、5 x 5または7 x 7(ffmpeg 4.0 以降)のカーネルが指定できるconvolution(畳み込み)フィルタの使い方。数学的な話はここでは説明しない。

Continue reading “鮮鋭化やぼかし、エンボス処理などができる convolution”

高速で万能な逆テレシネフィルタ pullup

pullupフィルタは逆テレシネフィルタで、ハードテレシネや24000/1001fpsプログレッシブや 30000/1001fpsプログレッシブの混在した映像に対応している。未来フレームを参照するように設計されていてパターン周期が不定期でも正しく逆テレシネし、不要な重複フィールドを自動で間引く。片フィールド補間は行わないのでその部分の映像はなめらかにはならない。入力フレームレートが29.97fpsの場合は24000/1001fpsに、30fpsや(まれに)テレシネされた25fpsの場合は24fpsになる。

pullupフィルタの後のPTS間隔はフレームを間引く前と変わらないVFRになり、そのまま出力するとフレームレートが元の映像のままになるので間引かれた後のフレームレートを指定することでPTS間隔も修正される。

ffmpeg でインターレース解除
映像と音声の pts を扱う setpts, asetpts

基本コマンド

日本で一般的なNTSCを24000/1001fpsプログレッシブに変換する。
2016年4月8日 ffplay は出力オプションに-rが使えなかったので直した。
ffmpeg -i input -vf pullup -r 24000/1001 output
ffplay -i input -vf pullup,fps=24000/1001

再生だけならPTSを修正するだけでもよい。
ffplay -i input -vf pullup,setpts=N/((24000/1001)*TB)

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

Continue reading “高速で万能な逆テレシネフィルタ pullup”

ffmpeg でのフレームレート設定の違い

ffmpegにはフレームレートの設定方法がいくつかあるが、同じオプションでも指定場所では効果が違ったりするので一般的な用途のまとめ。オリジナルよりもフレームレートが少ないときは同じように間引かれるが、出力結果も一致するとは限らない。オプションの-rは出力コンテナによって既定値が異なるのでMP4出力時と今回テストしているMKVとでは結果が異なり以下に説明している-fps_modeも併用する。

公式Wiki:ChangingFrameRate – FFmpeg

ffmpeg – Framerate vs r vs Filter fps – Stack Overflow
changing the framerate: “fps=X” filter vs “-r X” option : ffmpeg

Continue reading “ffmpeg でのフレームレート設定の違い”

2016年2月のニコ生統計

集計期間は週間のニコ生統計の2月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。

Continue reading “2016年2月のニコ生統計”

テレシネ処理ができる telecine

テレシネしてフレーム数を増やすことができるtelecineフィルタの使い方。日本で一般的なテレシネからヨーロッパ形式のテレシネまでいろいろなタイプを指定できる。

基本コマンド

インターレース具合がわかりやすいようにフレーム番号を振っている
ffplay -f lavfi -i color=black:r=24000/1001:d=10,drawtext=fontfile=C\\://WINDOWS/Fonts/msgothic.ttc:text='%{n}':fontcolor=yellow:x=(w-tw)/2:y=(h-th)/2:fontsize=64,telecine

インターレースの動画でfpsが2倍に読み込まれるときには-bsf:v h264_metadata=fixed_frame_rate_flag=1を指定する。
ffmpeg -i input -c:v libx264 -flags +global_header+ilme+ildct -weightp 0 -bsf:v h264_metadata=fixed_frame_rate_flag=1 output

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

Continue reading “テレシネ処理ができる telecine”

インターレースを解除する bwdif

bwdif(Bob Weaver Deinterlacing Filter)フィルタはyadifフィルタとキュービック補間アルゴリズムが使われているw3fdifフィルタを元とする動きに対応したインターレース解除フィルタである。

修正 2016年6月27日
deint オプションの初期値が最初のコミットからメジャーアップデートの 3.1 に変わるときに 0, all に変更。

ffmpeg でインターレース解除

Continue reading “インターレースを解除する bwdif”