Posted at

ffmpeg でファイルから4K HEVC疑似ライブストリーミング

More than 1 year has passed since last update.


はじめに

こんにちは streampack の木村です。

4K HEVC ライブ配信は業務として何回か経験があって、配信本番では小職が一年間働いても買えるのかコレ??的な超高級なハードウェア エンコーダーを使ったりしますが、検証になるとそんなものは当然持っていないので、んじゃ ffmpeg でやるべ! と意気揚々と挑んでハマったので備忘録です。


やりたいこと

やりたいことは単純です!

4K HEVC ライブ → Streaming Server → MPEG-DASH → Player

これを手元にあるもので実現したいっ!

上記を踏まえて下記を用意しました。


  • ffmpeg (ライブエンコーダー代わり AWS EC2)

  • Wowza Streaming Engine (AWS EC2)

  • ExoPlayer (Samsung Galaxy S8)


コンテンツの準備

http://4ksamples.com/ から適当なものを拝借

$ ffprobe Samsung_UHD_Soccer_Barcelona_Atletico_Madrid.ts

ffprobe version 3.4.2 Copyright (c) 2007-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-nonfree
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Samsung_UHD_Soccer_Barcelona_Atletico_Madrid.ts':
Metadata:
major_brand : iso4
minor_version : 1
compatible_brands: iso4hvc1
creation_time : 2014-06-03T22:43:24.000000Z
Duration: 00:03:52.00, start: 0.040000, bitrate: 45839 kb/s
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv), 3840x2160 [SAR 1:1 DAR 16:9], 45730 kb/s, 50 fps, 50 tbr, 50k tbn, 50 tbc (default)
Metadata:
creation_time : 2014-06-03T22:43:24.000000Z
handler_name : Encoded with IFME v3.2.1.0
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 117 kb/s (default)
Metadata:
creation_time : 2014-06-03T22:43:31.000000Z
handler_name : Track 1

このままだと ffmpeg で流せないので再エンコードしてフォーマットもMP4にします。

$ ffmpeg -i Samsung_UHD_Soccer_Barcelona_Atletico_Madrid.ts -acodec copy -c:v libx265 -x265-params keyint=60:min-keyint=60:scenecut=0:no-open-gop=1 -b:v 10000k -r 30 -minrate 10000k -maxrate 10000k -bufsize 20000k -preset fast -movflags faststart hevcuhd.mp4


設定


Wowza Streaming Engine



  1. Wowza Streaming Engine Manger コンソールにアクセスして live アプリケーションを開きます。

    ここで MPEG-DASH が有効であることを確認します。(デフォルトでは有効になっているはず)




  2. live > Stream Files に移動して、+ Add Stream File をクリックします。




  3. ダイアログが開くので以下のように入力します。

    Stream File 名は任意の名前の後ろに.streamが必要です。

    Stream URI には udp://0.0.0.0:{任意のUDPポート番号} とします。

    注:Wowza EC2に対してこのポート番号の UDP インバウンドを Security Group で通す必要があります。




  4. +Addをクリックすると Stream File に追加されるので、Actions の Connect to this stream をクリックします。




  5. ダイアログが開くので何も弄らずに OK をクリックします。



  6. live > Incoming Streams で Stream File が Active になっていることを確認します。


Wowza の設定は以上で完了です!

注: 以降、Wowza 起動直後や、再起動後には上記 4.と 5. を行う必要があります


ライブ配信

それでは早速ライブ配信をはじめてみましょう!


ffmpeg

以下のコマンドで 4K HEVC ファイルをループさせ、Wowza に UDP でストリームを投げつけます。

ffmpeg -re -stream_loop -1 -i hevcuhd.mp4 -vcodec copy -acodec copy -flags +loop-global_header -f mpegts udp://{Wowza の IP アドレス}:6000?pkt_size=1316

ハマった点

初め ffmpeg での投げ先を udp://{Wowza の IP アドレス}:6000 のみを指定して試しましたが、Wowza 側でストリームを受け付けずに困り果てていたところ ?pkt_size=1316 を付け加えろ! とどっかに書いてあったので試したところうまく行きました!


Wowza

Wowza Streaming Engine Manger の live > Monitoring でストリームが入力されているか確認します。

10Mbps でエンコしたので約10Mbpsの入力が確認できます。


再生

それでは実際に Player で視聴してみましょう。

相変わらずウチは HEVC を再生できるのが、スマホしかないので ExoPlayer で視聴します。


ExoPlayer

こんな感じでデプロイします。

Streaming Method
Streaming URL

MPEG-DASH
http://{Wowza IP アドレス}:1935/live/4Kdash.stream/manifest.mpd

HLS
http://{Wowza IP アドレス}:1935/live/4Kdash.stream/playlist.m3u8


視聴

一応再生できました!

video/hevc3840x2160 が表示されていますね。

HLS の方も ExoPlayer なら再生可能ですよ。


まとめ

一応当初の目的どおり、無料のツールを組み合わせて 4K HEVC ライブ配信を行うことができました!

(Wowzaは有償版を利用しましたが、テストだけなら開発者ライセンスで同じことができます)

しかしながら、たまにブロックノイズが乗って画面が乱れたりします。

何だろう、何がいけないのだろうか・・・

原因不明ですが、テストなので取り敢えずここまで!