2012-07-25 28 views
17

ffmpeg RTMPストリーミングを入力または出力として処理し、うまくいきます。FFMPEGを使用してビデオファイルをRTMPサーバーに連続的にストリームする

私はいくつかのビデオ(Pythonスクリプトで管理されている動的再生リスト)をRTMPサーバーにストリーミングしたいと思っています。私は現在、FFMPEGでRTMPサーバーにビデオを1つずつストリーミングしています。ビデオが終了するたびに接続が中断され、次のビデオが開始されたときにストリームが準備完了になります。

私はこれらのビデオを接続せずにストリーミングし続けたいと考えています。その後、ストリームを正しく見ることができます。

私は多くの日のためにインターネット上でいくつかの回避策を探した、と私は何人かの人々が、入力として名前付きパイプを使用して話してい

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 \ 
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv \ 
"rtmp://mystreamingserver/app/streamName" 

サーバに1によって自分の動画1をストリーミングするには、このコマンドを使用し

ffmpegでは、私はそれを試してみましたが、それはうまくいきませんでした。ffmpegは、新しいビデオが来たときにRTMPストリームを閉じるだけでなく、それ自体も閉じます。

これを行う方法はありますか?私は受け入れ答えを削除することはできませんと()(接続が切断せずにRTMPサーバーへffmpeg

+1

名前付きパイプを使用するのが適切な方法です。それがあなたのためにどうしてうまくいかなかったかを詳しく説明できますか? – blahdiblah

+0

@blahdiblah私はffmpegの入力として名前付きパイプを使用しました.ffmpegは一時停止し、パイプからデータをいくつか待ってから、 'cat video.mp4> fifo'を試み、ffmpegがストリームを開始し、ビデオをストリーミングした後に終了します。私は 'cat video1.mp4 video2.mp4> fifo'ffmpegがエラー'ストリーム4、オフセット0x1d83c:部分ファイル 'を最初のビデオをストリーミングした後に、正しい方法で名前付きパイプを使う方法を知らないと思います。私はこれが間違っていることを知っている、私はパイプを介して適切な方法でビデオデータを渡す必要があります。 – KKetch

+1

各ビデオにパイプ(ex vid1.mp4 - > pipe1、vid2.mp4 - > pipe2など)を使用してビデオの静的再生リストをストリーミングすることができました。それから、私はパイプ "stream"という名前の単一のストリームにこのように 'cat pipe1 pipe2 pipe3> stream'と書いています。私はFFMPEGの入力としてストリームパイプを使ってストリームを公開します。私はストリームを生き続けるために、より多くのビデオを "ストリーム"パイプに送りますか?**まだ私はそれを理解していません。 (最初のビデオを除いて、私はこのビデオファイルを取得するためにtailコマンドを使用して各ビデオファイルのメタデータをカットしなければならなかったことに注意してください) – KKetch

答えて

6

アップデートをビデオのダイナミックプレイリストをストリーミング:適切な解決策は、連結のと同様のカスタムデマルチプレクサを実装することです。そこには他のクリーンな方法は、以下

は醜いハックです!あなたはあなたの手が汚れてコードを取得する必要があります。現在ません。これはそれを行うには非常に悪い方法で、ちょうどんではない!

ソリューションコンカットデマルチプレクサを使用し、すべてのソースメディアfil同じコーデックを使用します。この例はMPEG-TSに基づいていますが、RTMPについても同じことができます。

  1. 次の形式でダイナミックプレイリストのあなたのためのエントリポイントの膨大なリストを保持しているプレイリストファイルを作成します。

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    これらのファイルは単なるプレースホルダです。

  2. はあなたを追跡し、スクリプト、現在のプレイリストのインデックスを作成し、current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. のためにオンザフライのシンボリックリンクを作成します
  4. ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  5. をプレイ

    スタートは、あなたは、バッファへのパイプあなたのループをすることができ、これからストリーミングインスタンスにあなたのパイプをバッファ怒っシステム管理者が

+0

おかげで、ちょうどあなたの答えを見た。私はhinekyleのコメントを早めに見つけました。たとえこの種のハックに興味がなくても、 – KKetch

+0

あなたが意味することを詳しく説明できますか?現在のプレイリストインデックスを追跡してシンボリックリンクを作成するスクリプトを作成します。 current_index + 1のために飛ぶ?これは何の目的ですか? – chovy

+0

.m3u8 24/7ストリームで同じことをしようとしています。しかし、コマンド '-c copy output -f mpegts stream.m3u8'はエラーを投げます。 – chovy

0

を追わと名前呼び出されます。

シェルでは、次のようになります。もちろん

#!/bin/bash 

for i in *.mp4; do 
     ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts - 
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream 

をあなたもプレイリストをループ、ループの任意の種類を使用することができます。

  • 私は、入力ストリーム
  • のためのx264は、私はなぜ知らないが、MPEG圧縮のための最低限の2つのスレッドが
  • 優れた入力圧縮の必要性を働き、MPEG、もう少し安定であることを把握出力フレームレートより速いので、十分に新しい入力を得ることができます。
  • タイムスタンプが連続していないため、出力に新しいタイムスタンプを生成して出力する必要があります。
  • バッファサイズは十分に大きくする必要がありますループが新しいクリップを取得するのに十分な時間を持つためです。

私は、Pythonベースのソリューションでは動作し、まだ完了していないが、いくつかの警告を除いて、私のテストストリームは、複数の日に実行されます。

ffplayout

これは、XMLプレイリストの形式を使用しています。プレイリストは動的なので、常に現在のプレイリストを編集したり、トラックを変更したり、新しいプレイリストを追加したりすることができます。

0

2つのプレイリストファイルを作成する必要があり、各ファイルの最後に別のファイルへのリンクを指定する必要があります。今

ffconcat version 1.0 
file 'item_2.mp4' 
file 'list_1.txt' 

list_2.txt

ffconcat version 1.0 
file 'item_1.mp4' 
file 'list_2.txt' 

list_1.txt

あなたが必要とするすべては、動的に次のプレイリストファイルの内容を変更することです。

関連する問題