2017-05-12 5 views
0

私はgstreamer(実際にはgst-launch-1.0)を使ってオーディオを受信し、flacencを使ってそれをエンコードしています。この時点では、テストのために、コマンドラインは次のようになります。gstreamerを使用してオーディオストリームを複数の連結された個別のファイルに分割して、単一の出力ストリームにしますか?

gst-launch-1.0 -q autoaudiosrc ! flacenc ! fdsink 

これは実際に子プロセスの標準出力を経由してFLACネイティブ形式のデータを取得し、別のプログラムによって起動されます。

さて、私が行うことができるようにしたいものを、アーカイブの目的のために、セグメントは、例えば、限られた期間の複数のファイルにこのオーディオストリームであります1ファイル/分。私はストリームを解析し、オーディオフレームを分割し、それらをバッファし、完全に形成されたFLACファイルを出力するのに必要な最小限の作業を行うコードを書いています。しかし、長期的には、何百ものストリームをアーカイブするとCPU負荷が心配です。

主な問題はフレーム番号です。それは可変長符号化を有し、さらに悪いことに、これは2つのCRCがすべてのフレームについて再計算されることを必要とする。私はどちらかができれば、それは素晴らしいと思いません:

  1. はGStreamerのは時々、またはより良い
  2. フレーム番号をリセットしてきたが、まったく新しいファイルミッドストリームを開始するのGStreamer?

後者の場合は理想的であろう。これをファイルにダンプしただけでは、有効なFLACファイルではありません。最初のセグメントの後、リーダーは、フレームヘッダーとポケを期待するファイルヘッダーを見つけます。しかし、私は受け取ったコードでそれを処理することができます。

私は様々なマルチプレクサおよび分割フィルタを使用する方法を理解しようとしているに取り組んでいますが、私が試した中で最も組み合わせは、この同類のエラーをもたらした:

WARNING: erroneous pipeline: could not link flacenc0 to splitmuxsink0 

私も、私ができることを承知していますgstreamerライブラリを使用して、おそらくオーディオソースを保管しておき、FLACエンコーダを上下に持っていくという私自身のコードでこのようなことをするでしょう。数ヶ月前、私はgstreamer APIにリンクしているプログラムを書く方法を一般的に理解しようとしましたが、徹底的に失われました。私はおそらく適切なドキュメントを見ていないだろう。

私はまた、これまで常に、私はgstreamerのコマンドラインでやりたいことを行うに賢い方法を見つけました。たとえば、FIFOからtsmpegストリームにメタデータを挿入することができました。だから多分、私はこの問題を同じように、kindoverflowflowのユーザーの助けを借りて解決することができます。 :)

解説:gstreamerが複数のファイルを書き込むことは望ましくありません。私はそれが複数のファイルを生成するが、それらをstdoutを経由して連結し、完全に別のプログラムをファイルに分割してもらいたい。

答えて

0

splitmuxsinkによって選択されたデフォルトミュクサーはFLACをサポートしていませんmp4mux、です。例としてmuxer = matroskamuxを設定すると、splitmuxsinkの使用に役立ちます。 matroskaにはFLACが含まれていますが、あなたが望むものであってもなくてもかまいません。

これはまだ動作しない可能性が高いですが、あなたは、コンテナを避けるために試してみて、splitmuxsinkでマクサーとしてflacparse利用できる作ることができます。

一方で、あなたは常に分割のコンテナを使用して、シンクプロパティを使用してコンテナを削除することができます。以下は、5秒のflacファイルを生成するパイプラインの例です。

gst-launch-1.0 audiotestsrc ! flacenc ! flacparse ! sm.audio_0 \ 
    splitmuxsink name=sm muxer=matroskamux \ 
         location=audio%05d.flac \ 
         max-size-time=5000000000 \ 
         sink="matroskademux ! filesink" 
+0

ありがとうございました。どこが間違っているのか分かりませんが、これは1つのファイルしか生成しません。 audio00000.flacが生成され、要求された期間です。 audio00001.flacが作成されますが、常にゼロです。これは、私が1秒間の持続時間を設定したことさえあります。 –

関連する問題