
データベースに保存されている SVG グラフィックからビデオを作成したいと考えています。それをアーカイブするための手順は次のとおりです。
- データベースに接続する
- パイプを入力として受け取るffmpegコマンドを作成する
- ffmpegの子プロセスを起動する
- プロセスの出力を待ちます。
別のスレッドを開始します: すべての svg ファイルに対して次の操作を実行します:
- データベースからSVGをバイトバッファにダウンロードする
- ffmpeg子プロセスのstdinにバイトバッファを書き込む
コードを実行すると、svg ファイルを ffmpeg にパイプするときに問題が発生します。
を使用しましたffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4
。しかし、ffmpeg で次のエラーが発生します。
[image2pipe @ 0x562ebd74c300] Could not find codec parameters for stream 0 (Video: svg (librsvg), none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
ffmpeg にフォーマットがあることがわかったのでsvg_pipe
、それを試してみましたが、成功せず、同じエラーが発生しました。
もう 1 つの可能性としては、すべての svg ファイルを一時ディレクトリにダウンロードし、パイプなしで ffmpeg を使用することです。これは私が試したときには機能しました。コマンドは次のようになります。ffmpeg -i *.svg -c:v libx264 out.mp4
ただし、私の場合はこれを避けたいと思います。
パイプされていないコマンドは機能するのに、パイプされたコマンド (例: cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4
) は失敗するのはなぜですか? また、私の場合、パイプをどのように使用すればよいですか?
現在の解決策:
私は-f rawvideo
引数を使ってグラフィックスをffmpegにパイプしています。これは有効な解決策ですが、SVGグラフィックスを生のRGB形式に変換する必要があることが前提となっています。この解決策はここから得ました。答えStackoverflow で。
答え1
試行錯誤を繰り返して、うまく機能する一連の引数を見つけることができました。
cat sample.svg | ffmpeg -f svg_pipe -frame_size 1000000000 -video_size 100x100 -i - -c:v libx264 -y out.mp4
svg_pipe
次のコマンドを実行すると、demuxerのオプションを取得できます。
ffmpeg -h demuxer=svg_pipe
出力:
デマルチプレクサ svg_pipe [パイプされた svg シーケンス]:
svg デマルチプレクサ AVOptions:
-frame_size .D......... フレーム サイズをバイト単位で強制します (0 から INT_MAX) (既定値は 0)
-framerate <video_rate> .D......... ビデオのフレーム レートを設定します (既定値は "25")
-pixel_format .D......... ビデオのピクセル形式を設定します
-video_size <image_size> .D......... ビデオ サイズを設定します
-loop .D......... 入力ファイル シーケンスを強制的にループします (既定値は false)
-frame_size
何らかの理由で、引数を入力ファイルのサイズよりも大きく設定する必要があります。
H.264 コーデックは透明性をサポートしていないため、ほとんどの場合、出力が奇妙に見えることに注意してください (デフォルトの背景色は黒です)。SVG
を白い背景に重ねることを検討してください。
例 (Ubuntu 18.04 で FFmpeg バージョン n4.3.1 を使用):
入力:
https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/atom.svg