ビデオを指定された長さのセグメントに分割する方法はありますか? 60分のビデオを12x5分に変換します。ビデオストリームをgstreamerで分割/分割する
答えて
Afaik、あなた自身の "セグメンタ"を開発する必要があります。これは、HTTPライブストリーミングファイルを作成するのに似ています。
multifilesink next-file = buffer(または次のファイルマーカー)を使用して、比較的小さなプログラム(Pythonで)を作成することができますメモリ内)。
入力ストリームをエンコードまたはデマルチプレクサにし、ストリームを元に戻す必要があります。希望の時間に達すると、キーフレームで多重化されたストリームをカットし、集約されたバッファをプッシュします(たとえば、シンクに新しいファイルを作成させるために、偽のキーフレームをマークします)。マルチプレクサを再初期化する(またはマルチプレクサのストリームヘッダを追加する)と、別々に再生できるよりも正しいヘッダを持つファイルを取得します(マルチプレクサによって異なります)。
gnonlin
およびgnlfilesource
がこれに対して作成されます。 gstreamerには、トランスコードなしで特定のフォーマットを分割する特別なサポートがないため、ビデオをプロセスの一部としてトランスコードする必要があります。
オーディオファイルからクリップを作成する方法の例については、How do I use gstreamer to make an audio clip from a segment of a longer source?を参照してください。
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');
}
);
FFMPEGにはセグメントデマルチプレクサが組み込まれています。
ドキュメントの-segmentオプションを確認してください。
- 1. 分割する分割ウィンドウ
- 2. クリップボードを分割で分割する
- 3. PHPのSMSゲートウェイの分割を分割
- 4. 非分割テーブルの分割インデックス
- 5. HTMLの領域分割と再分割
- 6. 分割dmpファイルを複数のdmpファイルに分割する
- 7. 分割裁定ストリングをラインに分割する
- 8. QFile:ファイルを部分に分割する
- 9. スナッピーは分割可能か分割不可ですか?
- 10. Java - デリミタで分割
- 11. 文字列を分割して分割セグメントを変数に割り当てる
- 12. SQLのメールテーブル:分割するか分割しない?
- 13. 分割言葉
- 14. 分割フロート
- 15. KDTree分割
- 16. GWTPコード分割
- 17. MySQLテーブル分割
- 18. mysqlの分割
- 19. 分割PHP
- 20. 分割LINQ
- 21. UILabel分割
- 22. 分割法
- 23. 分割データフレームと
- 24. 分割リンク列
- 25. 分割CSV
- 26. ルートルート分割パス
- 27. 分割単語
- 28. 式の分割
- 29. テンプレートと分割
- 30. 分割列
私はのgstreamerをダンプし、代わりにFFMPEGライブラリを使用してセグメンタを書きました。そのために醜いCプログラムを書く必要があった;-) – Saideira