如何使用 ffmpeg 管道從 svg 檔案建立影片?

如何使用 ffmpeg 管道從 svg 檔案建立影片?

我想從資料庫中儲存的 svg 圖形建立影片。我的歸檔程序如下:

  1. 連接到資料庫
  2. 建立以管道作為輸入的 ffmpeg 命令
  3. 產生 ffmpeg 子進程
  4. 等待進程的輸出。

啟動另一個執行緒:對於所有 svg 檔案執行以下操作:

  1. 將 svg 從資料庫下載到位元組緩衝區
  2. 將位元組緩衝區寫入 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_pipeffmpeg 中有一種格式,所以我嘗試了 - 沒有成功,同樣的錯誤。

另一種可能性是將所有 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

輸出:
在此輸入影像描述

相關內容