
我想從資料庫中儲存的 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
我發現svg_pipe
ffmpeg 中有一種格式,所以我嘗試了 - 沒有成功,同樣的錯誤。
另一種可能性是將所有 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