月別アーカイブ: 2016年4月

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 の順番が大きく変わる。
続きを読む abemaTV の番組表 json

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

ffmpeg で Apple HTTP Live Streaming(通称、HLS)形式に出力する方法。各セグメントの動画ファイルは .ts でプレイリストとなるマニフェストは .m3u8 で出力される。また segment muxer のオプションを使うことでより詳細な設定ができる。

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

HTTP Live Streaming (HLS) – Apple Developer
(PDF) Apple の HTTPライブストリーミングの概要(日本語)
HLS の公式ドキュメント:draft-pantos-http-live-streaming – HTTP Live Streaming

基本コマンド

ffmpeg -i input output.m3u8

.mp4 を HLS 形式にコーデックコピーする例
ffmpeg -i input.mp4 -bsf:v h264_mp4toannexb -c copy output.m3u8

.mp4 から暗号化とセグメントの時間指定(60秒)をする例(file.keyinfo は後述)
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_key_info_file file.keyinfo -hls_list_size 0 -hls_time 60 output.m3u8

一般的な配信用の HLS 出力コマンド例
ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts

セグメントを出力して連結した動画も出力するコマンド例は4通りある

Creating multiple outputs – trac.ffmpeg.org

  1. セグメントと連結した動画の2種類エンコードする。つまり負荷も2倍
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb output.ts
  2. 上の2種類エンコードせずに、udp などにエンコードした映像を流して再度 ffmpeg で -c copy で取り込みセグメントと連結した動画の2種類を出力する
    ffmpeg -re -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f mpegts "udp://localhost:8080"
    ffmpeg -i "udp://localhost:8080" -c copy -f segment -segment_format mpegts -segment_time 10 -segment_list output.m3u8 -c copy output_%04d.ts -c copy output.ts -y
  3. すべてのセグメントを書き込むように設定し、ffmpeg でマニフェストを読み込み -c copy で連結する
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -hls_list_size 0 -segment_format mpegts -segment_time 10 -segment_list output.m3u8 output_%04d.ts
    ffmpeg -i "output.m3u8" -c copy output.ts
  4. tee muxer を使って1度のエンコードで2出力する
    ffmpeg -i input -vcodec libx264 -acodec aac -flags +loop-global_header -bsf:v h264_mp4toannexb -f segment -hls_list_size 0 -segment_format mpegts -segment_time 10 -segment_list output.m3u8 -f tee -map 0:v -map 0:a "[f=hls]output.m3u8|output.ts"

公式ドキュメント:FFmpeg Formats Documentation : hls
続きを読む ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

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

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

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法

基本コマンド

60秒ごとに .mp4 で分割して out.csv で分割データを記載したファイルも出力する
ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 60 -segment_list out.csv out%03d.mp4

時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める
ffmpeg -i input.mp4 -force_key_frames 1,2,3,5,8,13,21 -map 0 -c:v libx264 -c:a aac -f segment -segment_time 60 -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 -segment_list out.csv out%03d.mp4

公式ドキュメント:FFmpeg Formats Documentation : segment, stream_segment, ssegment
続きを読む 詳細な分割設定ができる Segment

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

3×3 または 5×5 のカーネルが指定できる convolution の使い方。数学的な話やマトリクスはここでは説明しない。出力フォーマットは yuv。

基本コマンド

3×3 のカーネル。基本コマンドは何も変化しない
ffplay -i input -vf convolution="0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:1:1:1:1:0:0:0:0"

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

関連記事

続きを読む 先鋭化やぼかし、エンボス処理などができる convolution