code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PT2/Friioの映像をiPhone/iPadで見る (ffmpeg編)

前回(PT2/Friioの映像をiPhone/Kindle Fire HDで見る)の続き。RecTaskで受信するところはそのままに今度はffmpegで受信してHLS(HTTP Live Streaming)用のファイルを生成した。最終的な配信はApacheに任せているところも変更なし。

もうひとつ。RecTask→ffmpeg→VLC→Apacheで配信というものも掲載。

Kindleはお蔵に入れてしまったので試していないです。Windows 7 Ultimate 64bitで作業しました。

VLCの問題点

VLC版の問題点、『チャンネル切替時あるいはCMになった時に落ちてしまう』という問題があり、そのたびに再起動するのが手間であった。特にBSでスポーツ中継を見てる時に数十分おきに落ちるのはとても手間。本当はプロセス見て自動化するようなプログラム書けばいいんだけど、そこまでの時間がまだ持てていない。

尚、現在のVLC単体版では次のようなコマンドで起動している。以後すべてコマンドラインに直接入力した場合で書いている。(バッチファイルにする場合、一部の文字をエスケープする必要があったりしますけど今回は割愛)

start /high vlc.exe ^
-I dummy ^
udp://@:3456 ^
--sout "#transcode{width=640,height=360,vcodec=h264,vb=256,fps=24,venc=x264{aud,profile=baseline,level=30,keyint=30,ref=1},acodec=aac,aenc=avcodec{strict=-2},ab=128,samplerate=48000,channels=2,audio-sync,hurry-up}:std{access=livehttp{seglen=10,delsegs=true,numsegs=4,index=x:\var\www\html\stream\stream.m3u8,index-url=stream-########.ts},mux=ts{use-key-frames},dst=x:\var\www\html\stream\stream-########.ts}"

使用しているバージョンはVLC Nightly Buildvlc-2.1.0-git-20130410-0403-win64.7z

そこでffmpeg

VLCは再生にとても強いが、エンコーディングと言えばやっぱりffmpegということでffmpegを試す。以前の記事を書いたときもffmpegを試したが、その時は対応してなかったか、理解できなかったかで断念していた。

結果的には、ffmpegを通してPT2のストリーミングをエンコすると落ちることはほとんどなくなった。

ffmpegは公式サイトから辿っていけるWindowsバイナリffmpeg-20130418-git-ee94362-win64-static.7zを使用。

まずはffmpeg単体でHLS

画像圧縮してるので実際の画面とは異なりますが、

ffmpeg単体でHLSを行う場合。この方法の(恐らく)唯一の弱点は『生成された.tsファイルが自動的に削除されない』。VLCの--sout-livehttp-delsegs (delsegs)に相当するオプション探したけど見つからなかった。ただインデックスファイルに記録する.tsファイルの数は指定できるのでリロードした際常に最初から始まるということにはならないため、古いファイルを削除するバッチを組めば問題ない。バッチを組むのが面倒なので、現在は次に紹介するVLC+ffmpegバージョンで運用中。

pushd x:\var\www\html\stream

x:\usr\local\ffmpeg-20130418-git-ee94362-win64-static\bin\ffmpeg.exe ^
-i udp://127.0.0.1:3456?pkt_size=262144^&fifo_size=1000000^&overrun_nonfatal=1 ^
-f segment ^
-segment_format mpegts ^
-segment_time 10 ^
-segment_list_size 5 ^
-segment_list stream.m3u8 ^
-threads auto ^
-map 0:0 -map 0:1 ^
-acodec libvo_aacenc -ar 48000 -ab 192k -ac 2 ^
-vcodec libx264 -s 640x360 -aspect 16:9 -vb 256k ^
-fpre x:\usr\local\ffmpeg-20130418-git-ee94362-win64-static\presets\libx264-ipod640.ffpreset ^
stream%03d.ts

最後のファイル名(stream%03d.ts)が出力ファイル名であり、かつインデックスファイル(stream.m3u8)に書き込まれるファイル名になるのでここに絶対パスが書けない点に注意。ここではpushdで予めそのフォルダに移動からffmpegを呼び出している。

10秒毎に.tsファイルを生成して、インデックスには最新の5ファイルを記録するように設定。映像、音声の設定はお馴染みのものなので省略。

-fpreにはffmpegをダウンロードした時についてきたlibx264-ipod640.ffpresetを指定しているが、flags=+loop-global_headerという設定を追加している。この設定がないとH.264 bitstream malformed, no startcode found, use the h264_mp4toannexb bitstream filter (-bsf h264_mp4toannexb)で落ちてしまうため。

VLC+ffmpeg

ffmpegで安定したエンコードを行い、VLCの自動削除(delsegs)を使って余分なファイルを削除する方法。

PT2→Spinel→RecTaskからUDPでffmpegの3456ポートにデータを飛ばして、ffmpegで今度はUDPの1234ポートにリピートする。VLCでUDPの1234ポートでffmpegの結果を受け取って分割した.tsファイルとインデックスファイルを生成する。あとはApacheに配信して頂く。

まずはデータストリームをトランスコーディングしてリピートするffmpeg君を次のコマンドで起動。

x:\usr\local\ffmpeg-20130418-git-ee94362-win64-static\bin\ffmpeg.exe ^
-i udp://127.0.0.1:3456?pkt_size=262144^&fifo_size=1000000^&overrun_nonfatal=1 ^
-f mpegts ^
-threads auto ^
-map 0:0 -map 0:1 ^
-acodec libvo_aacenc -ar 48000 -ab 192k -ac 2 ^
-vcodec libx264 -s 640x360 -aspect 16:9 -vb 256k ^
-fpre x:\usr\local\ffmpeg-20130418-git-ee94362-win64-static\presets\libx264-ipod640.ffpreset ^
udp://127.0.0.1:1234?pkt_size=262144

データストリーム(PT2から届くストリーム)の映像(0:0)と主音声(0:1)を取り出して、h264+aacの640x360のアスペクト比16:9でエンコ。エンコしたデータの送信先をudp://127.0.0.1:1234としている。

pushd x:\usr\local\vlc-2.1.0-git-20130410-0403

start /high vlc.exe ^
-I dummy ^
udp://@:1234 ^
--sout-standard-access=livehttp ^
--sout-livehttp-seglen=10 ^
--sout-livehttp-splitanywhere ^
--sout-livehttp-delsegs ^
--sout-livehttp-numsegs=6 ^
--sout-livehttp-ratecontrol ^
--sout-livehttp-index=x:\var\www\html\stream\stream.m3u8 ^
--sout-livehttp-index-url=stream-########.ts ^
--sout=x:\var\www\html\stream\stream-########.ts

--sout="#transcode{}"とは違った書き方にしているけど、上記VLC単体版に書いたような--sout="#transcode{}"の書き方でも実行できる。

この場合VLCではトラスコ(トランスコーディング)は行わず分割だけを行う。

VLCの場合2.1.0の問題かもしれないがvlc.exeのあるフォルダに移動してから実行しないと『VLC media player could not start. Either the command line options were invalid or no plugins were found.』というエラーが出てうまく起動できなかった。プラグインが見つからないというエラーなので環境変数を設定すれば直るのかもしれないが試してはいない。

尚、VLCでも再エンコを行う場合は次のようなオプションの指定も可能。--sout="#transcode{}"の別の書き方ということで掲載。

pushd x:\usr\local\vlc-2.1.0-git-20130410-0403

start /high vlc.exe ^
-I dummy ^
udp://@:1234 ^
--sout-standard-access=livehttp ^
--sout-livehttp-seglen=10 ^
--sout-livehttp-splitanywhere ^
--sout-livehttp-delsegs ^
--sout-livehttp-numsegs=6 ^
--sout-livehttp-ratecontrol ^
--sout-livehttp-index=x:\var\www\html\stream\stream.m3u8 ^
--sout-livehttp-index-url=stream-########.ts ^
--sout-transcode-width=640 ^
--sout-transcode-height=360 ^
--sout-transcode-vcodec=h264 ^
--sout-transcode-vb=256 ^
--sout-transcode-fps=24 ^
--sout-transcode-venc=x264 ^
--sout-x264-aud ^
--sout-x264-profile=baseline ^
--sout-x264-level=30 ^
--sout-x264-keyint=30 ^
--sout-x264-ref=1 ^
--sout-transcode-aenc=aac ^
--sout-transcode-acodec=avcodec{strict=-2} ^
--sout-transcode-ab=128 ^
--sout-transcode-samplerate=48000 ^
--sout-transcode-channels=2 ^
--sout-transcode-audio-sync ^
--audio-track=0 ^
--sout-ts-use-key-frames ^
--sout-standard-mux=ts ^
--sout=x:\var\www\html\stream\stream-########.ts

最後に。

SoftBank SELECTION 録画対応 iPhone・iPad用デジタルTVチューナーエリアフリーTV SB-TV04-WRIP

そもそもこんな面倒なことをしなくても、今はエリアフリーという製品があるらしいので、そっちでいいんじゃないかと思えてきた。

関連記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。