share facebook facebook twitter menu hatena pocket slack

2018.05.29 TUE

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

木村 智一

WRITTEN BY 木村 智一

はじめに

こんにちは 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は有償版を利用しましたが、テストだけなら開発者ライセンスで同じことができます)

しかしながら、たまにブロックノイズが乗って画面が乱れたりします。
何だろう、何がいけないのだろうか・・・

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

元記事はこちら

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

木村 智一

木村 智一

動画一筋! 犬と闘う streampack チームリーダー

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。