LoginSignup
3
5

More than 5 years have passed since last update.

golangでffmpegやx264つかってhtml5のMediaRecorderの出力を受けてみる 3日目

Posted at

概要

1日目
http://qiita.com/taktod/items/0d87e511388fde7ffe2d
2日目
http://qiita.com/taktod/items/278255153b6bba68e95f

これらの続き
今日は3日目

今日はttLibGoをつかってちょっとしたサーバープログラム書いてみました。

https://github.com/taktod/websocketPublishTest
できたのがこれです。

流れ

html5のgetUserMediaとMediaRecorderを利用してwebmファイルを作成
そのデータをwebsocketでgoに渡す

で、go側で取得データをデコード & エンコードしてfragmented mp4の形で保存してみる

というコードを書いてみました。

今の所とりあえずファイルに保存してるだけですが、h264 & aacにエンコードしたものをrtmpサーバーにpublishしてもいいし
websocketで他の視聴クライアントになげてMediaSourceExtつかって再生して配信してもいいし
mpegtsに書き出してHLSを組んでもいいと思います。

やってて思ったこと

最近のMediaRecorder(chrome)ってh264吐くんですね

MediaRecorderで特に指定せずに書き出しやってみたところ、h264 & opusのwebmになりました。
そういえば、webRTCもh264対応してましたっけ
なんか地味に時代を感じました。

opusの音声の開始が0からはじまってなかった

はじめつくって録画したデータを聞いてみたところ、なんか音声と映像の同期がずれてました。
調査してみたところpts が0.08あたりから開始してました。
そんなことあるんですね。

h264データのkeyFrame間隔

writerの動作はkeyFrameがきたらデータを書き込むという処理にしてあるのですが
chromeが出力するwebmのh264データをみていたところ、keyFrameの間隔が非常に長そうでした。
なので、初めはencodeかけずに取得フレームをそのまま利用していたのですが、急遽x264でencodeし直す形に・・・

まぁ、x264Encoderの動作テストできてよかったかな。
ただ、手元のテストでは、生成データのサイズが2倍ほどに大きくなってしまったので、もうちょっと変換パラメーター
調整しないとだめだなぁと思いました。

FrameのID

chromeが出力するwebmですがopusがtrack1、h264がtrack2になってました。

writerの処理の初期化の関係でh264をtrack1、aacをtrack2にしているので、そこが妙な気分に・・・
かといって、フレームをいくつか取得してからwriterを初期化するのもなんだかな・・・と思ったので
IDを直書きすることにしました。
もちろんこのコードだと、映像のみや音声のみのデータは扱えません。

つくった感想

まぁ、楽しくかけたかな。
特に大きなトラブルもなくつくれましたし・・・

こういう感じに息抜きにサクッとプログラム書いて
go runで簡単に実行できるのは便利でいいですね。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5