Help us understand the problem. What is going on with this article?

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 が有効であることを確認します。(デフォルトでは有効になっているはず)

    スクリーンショット 2018-05-10 15.03.36.png

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

    スクリーンショット 2018-05-10 15.01.17.png

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

    Stream File 名は任意の名前の後ろに.streamが必要です。
    Stream URI には udp://0.0.0.0:{任意のUDPポート番号} とします。

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

    スクリーンショット 2018-05-10 15.02.17.png

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

    スクリーンショット 2018-05-10 15.19.57.png

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

    スクリーンショット 2018-05-10 15.21.46.png

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

スクリーンショット 2018-05-10 15.27.02.png

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の入力が確認できます。

Image uploaded from iOS.png

再生

それでは実際に 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

Image uploaded from iOS (1).jpg

視聴

一応再生できました!
video/hevc3840x2160 が表示されていますね。

Screenshot_20180510-162943_ExoPlayer.jpg

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

まとめ

一応当初の目的どおり、無料のツールを組み合わせて 4K HEVC ライブ配信を行うことができました!
(Wowzaは有償版を利用しましたが、テストだけなら開発者ライセンスで同じことができます)

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

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

tomopyonsama
セロー買うたった 林道林道
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした