2016-12-14 55 views
0

私はGstreamerでビデオをシークアブルにしようとしていますが、複数の調査の後、matroskamuxとfilesinkプラグインがそれを行いますが動作しません。Gstreamerでシーク可能なビデオを作成する方法

これは私のパイプラインである:

gst-launch-1.0 videotestsrc ! x264enc ! h264parse ! matroskamux ! filesink location=test.mkv 

私は5秒のビデオを作成します。

^Chandling interrupt. 
Interrupt: Stopping pipeline ... 
Execution ended after 0:00:05.989791758 
Setting pipeline to PAUSED ... 
Setting pipeline to READY ... 
Setting pipeline to NULL ... 
Freeing pipeline ... 

私はのgstreamerから発見のアプリを実行すると:

[email protected]:~/Desktop$ gst-discoverer-1.0 test.mkv 
Analyzing file:///home/user/Desktop/test.mkv 
Done discovering file:///home/user/Desktop/test.mkv 

Topology: 
    container: Matroska 
    video: H.264 

Properties: 
    Duration: 0:00:00.566333333 
    Seekable: yes 
    Tags: 
     container format: Matroska 
     video codec: H264 
     minimum bitrate: 989280 
     bitrate: 1045608 
     maximum bitrate: 989280 

を持続期間が0であります:00:00.566333333、この値は実際のビデオ期間に関係なく同じです!ビデオはシークできません。

私は間違っていますか?

答えて

1

要素がストリームを正しく終了できるようにするには、EOS(End of stream)イベントをパイプラインに送信する必要があります。これがなければ、マルチプレクサはファイルを正しく終了させることができず、すべてが処理された後にのみ書き込むことができるインデックスおよびヘッダを書き込むことができなくなる。割り込みとしてパイプラインをNULLに設定すると、すぐにすべてが停止し、muxerはファイルを未完成のままにします。

-eフラグは、パイプラインを停止する前にEOSをプッシュして待機させる必要があります。コードでは、レコーディングを中断したい場合は、自分でイベントを送信してから、EOSがGstBusで受信されるまで待つ必要があります。

ファイルなどの一部の入力が終了しています。このような場合、ソース要素は通常、読み込みが終了するとEOS自体を送信します。これは、理論上は無限であるストリームから読み込むソース(カメラなど)では当てはまりません。

+0

ありがとうございます!出来た! – PierreOlivier

関連する問題