2011-01-26 80 views

答えて

1

Afaik、あなた自身の "セグメンタ"を開発する必要があります。これは、HTTPライブストリーミングファイルを作成するのに似ています。

multifilesink next-file = buffer(または次のファイルマーカー)を使用して、比較的小さなプログラム(Pythonで)を作成することができますメモリ内)。

入力ストリームをエンコードまたはデマルチプレクサにし、ストリームを元に戻す必要があります。希望の時間に達すると、キーフレームで多重化されたストリームをカットし、集約されたバッファをプッシュします(たとえば、シンクに新しいファイルを作成させるために、偽のキーフレームをマークします)。マルチプレクサを再初期化する(またはマルチプレクサのストリームヘッダを追加する)と、別々に再生できるよりも正しいヘッダを持つファイルを取得します(マルチプレクサによって異なります)。

+0

私はのgstreamerをダンプし、代わりにFFMPEGライブラリを使用してセグメンタを書きました。そのために醜いCプログラムを書く必要があった;-) – Saideira

1

gnonlinおよびgnlfilesourceがこれに対して作成されます。 gstreamerには、トランスコードなしで特定のフォーマットを分割する特別なサポートがないため、ビデオをプロセスの一部としてトランスコードする必要があります。

オーディオファイルからクリップを作成する方法の例については、How do I use gstreamer to make an audio clip from a segment of a longer source?を参照してください。

0

GStreamerとGLibバインディングでPerlを使って同様のことを達成できました。私のハックはファイル同期の位置をリセットするためにGStreamerパイプライン状態を悪用します。私はストリーミングソースを使用しているため、set_state( 'null')の後のゼロ動作へのリセットは受け入れられます。適切なセグメンテーションをサポートするには、ソース要素のシーク位置を管理する必要があります。

my $g_pipeline = GStreamer::Pipeline->new('pipeline'); 
.... 
my $g_filesink = GStreamer::ElementFactory->make(filesink => "filesink"); 
$g_filesink->set(location => $file_name); 
... 
$g_pipeline->add(..., $g_filesink); 

my $delay = 5000; # switch output file at this interval 
my $timer = Glib::Timeout->add($delay, 
    sub { 
    $g_pipeline->set_state('null'); 
    ... 
    $g_filesink->set(location=> $next_file_name); 
    $g_pipeline->set_state('playing'); 
    } 
);