目錄
- 1 一般問題
- 2 編譯
- 3 使用方法
- 3.1 ffmpeg 無法運作;哪裡出錯了?
- 3.2 我該如何將單張圖片編碼成影片?
- 3.3 我該如何將影片編碼成單張圖片?
- 3.4 為什麼我使用多執行緒 MPEG* 編碼時會看到輕微的品質下降?
- 3.5 我該如何從標準輸入讀取或寫入到標準輸出?
- 3.6 -f jpeg 無效。
- 3.7 為什麼我無法更改幀率?
- 3.8 我該如何使用 ffmpeg 編碼 Xvid 或 DivX 影片?
- 3.9 哪些是編碼高品質 MPEG-4 的良好參數?
- 3.10 哪些是編碼高品質 MPEG-1/MPEG-2 的良好參數?
- 3.11 使用 ffmpeg 編碼交錯式視訊看起來很糟糕,哪裡出錯了?
- 3.12 我該如何讀取 DirectShow 檔案?
- 3.13 我該如何合併影片檔案?
- 3.14 我該如何串連影片檔案?
- 3.15 使用 -f lavfi,音訊莫名其妙地變成單聲道。
- 3.16 為什麼 FFmpeg 看不到我的 VOB 檔案中的字幕?
- 3.17 為什麼
ffmpeg
-sameq 選項被移除了?該用什麼來替代? - 3.18 我有一個拉伸的影片,為什麼縮放無法修復它?
- 3.19 我該如何在背景工作執行 ffmpeg?
- 3.20 我該如何防止 ffmpeg 因為類似 suspended (tty output) 的訊息而暫停?
- 4 開發
- 4.1 是否有範例說明如何使用 FFmpeg 函式庫,特別是 libavcodec 和 libavformat?
- 4.2 你們可以支援我的 C 編譯器 XXX 嗎?
- 4.3 是否支援 Microsoft Visual C++?
- 4.4 你們可以加入 automake、libtool 或 autoconf 支援嗎?
- 4.5 為什麼不使用物件導向 C++ 重寫 FFmpeg?
- 4.6 為什麼 ffmpeg 程式缺少除錯符號?
- 4.7 我不喜歡 LGPL,我可以改在 GPL 下貢獻程式碼嗎?
- 4.8 我在我的 C 應用程式中使用了 FFmpeg,但連結器抱怨函式庫本身缺少符號。
- 4.9 我在我的 C++ 應用程式中使用了 FFmpeg,但連結器抱怨缺少似乎可用的符號。
- 4.10 我在我的 C++ 應用程式中使用了 libavutil,但編譯器抱怨 'UINT64_C' 未在此作用域中宣告
- 4.11 我有一個記憶體中的檔案 / 一個與 *open/*read/ libc 不同的 API,我該如何將它與 libavformat 一起使用?
- 4.12 關於 ffv1、msmpeg4、asv1、4xm 的文件在哪裡?
- 4.13 我該如何將 H.263-RTP(以及 RTP 中的其他編碼器)饋送到 libavcodec?
- 4.14 AVStream.r_frame_rate 是錯誤的,它遠高於幀率。
- 4.15 為什麼
make fate
沒有執行所有測試? - 4.16 為什麼
make fate
找不到範例?
1 一般問題
1.1 為什麼 FFmpeg 不支援 [xyz] 功能?
因為還沒有人承擔這項任務。FFmpeg 的開發是由個別開發人員認為重要的任務所驅動的。如果您有重要的功能,實現它的最佳方法是自己承擔任務或贊助開發人員。
1.2 FFmpeg 不支援 XXX 編碼器。你們可以加入 Windows DLL 載入器來支援它嗎?
不。Windows DLL 不可移植、臃腫且通常很慢。此外,FFmpeg 致力於原生支援所有編碼器。DLL 載入器不利於實現該目標。
1.3 雖然這個檔案格式似乎受到 ffmpeg 支援,但我無法讀取它。
即使 ffmpeg 可以讀取容器格式,它也可能不支援其所有編碼器。請查閱 ffmpeg 文件中支援的編碼器列表。
1.4 Windows 支援哪些編碼器?
Windows 對 MPEG 等標準格式的支援不是很好,除非您安裝一些額外的編碼器。
以下視訊編碼器列表應可在大多數 Windows 系統上運作
- msmpeg4v2
.avi/.asf
- msmpeg4
僅限 .asf
- wmv1
僅限 .asf
- wmv2
僅限 .asf
- mpeg4
僅當您安裝了像 ffdshow 或 Xvid 這樣的 MPEG-4 編碼器時。
- mpeg1video
僅限 .mpg
請注意,ASF 檔案在 Windows 中通常具有 .wmv 或 .wma 副檔名。還應提及的是,微軟聲稱擁有 ASF 格式的專利,並可能起訴或威脅使用非微軟軟體建立 ASF 檔案的使用者。強烈建議盡可能避免使用 ASF。
以下音訊編碼器列表應可在大多數 Windows 系統上運作
- adpcm_ima_wav
- adpcm_ms
- pcm_s16le
總是
- libmp3lame
如果安裝了像 LAME 這樣的 MP3 編碼器。
2 編譯
2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
這是 gcc 中的一個錯誤。請不要向我們回報。相反地,請向 gcc 開發人員回報。請注意,我們不會為 gcc 錯誤新增任何變通方法。
另請注意,(一些)gcc 開發人員認為這不是錯誤,或者不是他們應該修復的錯誤:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203。再說一次,他們中的一些人不知道不可判定問題和 NP 困難問題之間的區別...
2.2 我已經使用我的發行版的套件管理器安裝了這個函式庫。為什麼 configure
看不到它?
發行版通常將函式庫分成多個套件。主套件包含使用該函式庫執行程式所需的檔案。開發套件包含使用該函式庫建置程式所需的檔案。有時,文件和/或資料也位於單獨的套件中。
要建置 FFmpeg,您需要安裝開發套件。它通常稱為 libfoo-dev 或 libfoo-devel。您可以在建置完成後將其移除,但請務必保留主套件。
2.3 我該如何讓 pkg-config
找到我的函式庫?
在您的函式庫的某個位置,在 pkgconfig 目錄中會有一個 .pc 檔案(或多個)。您需要設定環境變數,以將 pkg-config
指向這些檔案。
如果您需要新增目錄到 pkg-config
的搜尋列表(典型用例:單獨安裝的函式庫),請將其新增到 $PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
如果您需要取代 pkg-config
的搜尋列表(典型用例:交叉編譯),請在 $PKG_CONFIG_LIBDIR
中設定它
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
如果您需要知道函式庫的內部依賴項(典型用途:靜態連結),請將 --static
選項新增到 pkg-config
./configure --pkg-config-flags=--static
2.4 當交叉編譯時,我該如何使用 pkg-config
?
最好的方法是在您的交叉編譯環境中安裝 pkg-config
。它會自動使用交叉編譯函式庫。
您也可以從主機環境中使用 pkg-config
,方法是明確地將 --pkg-config=pkg-config
指定給 configure
。在這種情況下,您必須使用 PKG_CONFIG_LIBDIR
將 pkg-config
指向正確的目錄,如前一個條目中所述。
作為一個中間解決方案,您可以在您的交叉編譯環境中放置一個腳本,該腳本使用設定的 PKG_CONFIG_LIBDIR
呼叫主機 pkg-config
。該腳本可能看起來像這樣
#!/bin/sh PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig export PKG_CONFIG_LIBDIR exec /usr/bin/pkg-config "$@"
3 使用方法
3.1 ffmpeg 無法運作;哪裡出錯了?
在建置之前,嘗試在 ffmpeg 原始碼目錄中執行 make distclean
。如果這沒有幫助,請參閱 (https://ffmpeg.dev.org.tw/bugreports.html)。
3.2 我該如何將單張圖片編碼成影片?
首先,重新命名您的圖片以遵循數字序列。例如,img1.jpg、img2.jpg、img3.jpg,... 然後您可以執行
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
請注意,'%d' 會被圖片編號取代。
img%03d.jpg 表示序列 img001.jpg、img002.jpg 等。
使用 -start_number 選項來宣告序列的起始編號。如果您的序列不是從 img001.jpg 開始,但仍然是數字順序,這會很有用。以下範例將從 img100.jpg 開始
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
如果您有大量圖片需要重新命名,您可以使用以下命令來減輕負擔。該命令使用 bourne shell 語法,將目前目錄中所有符合 *jpg
的檔案符號連結到 /tmp 目錄,序列為 img001.jpg、img002.jpg 等。
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
如果您想按最舊修改時間優先排序,請將 $(ls -r -t *jpg)
替換為 *jpg
。
然後執行
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
相同的邏輯適用於 ffmpeg 讀取的任何圖片格式。
您也可以使用 cat
將圖片管道傳輸到 ffmpeg
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
3.3 我該如何將影片編碼成單張圖片?
使用
ffmpeg -i movie.mpg movie%d.jpg
用作輸入的 movie.mpg 將被轉換為 movie1.jpg、movie2.jpg 等...
除了依賴檔案格式自動識別之外,您也可以使用
- -c:v ppm
- -c:v png
- -c:v mjpeg
來強制編碼。
將其應用於先前的範例
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
請注意,沒有 "jpeg" 編碼器。請改用 "mjpeg"。
3.4 為什麼我使用多執行緒 MPEG* 編碼時會看到輕微的品質下降?
對於多執行緒 MPEG* 編碼,編碼切片必須是獨立的,否則執行緒 n 實際上必須等待執行緒 n-1 完成,因此品質略有下降是相當合理的。這不是錯誤。
3.5 我該如何從標準輸入讀取或寫入到標準輸出?
使用 - 作為檔案名稱。
3.6 -f jpeg 無效。
嘗試 '-f image2 test%d.jpg'。
3.7 為什麼我無法更改幀率?
某些編碼器,例如 MPEG-1/2,僅允許少量固定的幀率。使用 -c:v 命令列選項選擇不同的編碼器。
3.8 我該如何使用 ffmpeg 編碼 Xvid 或 DivX 影片?
Xvid 和 DivX(4+ 版本)都是 ISO MPEG-4 標準的實作(請注意,還有許多其他編碼格式也使用相同的標準)。因此,使用 '-c:v mpeg4' 以這些格式編碼。儲存在 MPEG-4 編碼檔案中的預設 fourcc 將是 'FMP4'。如果您想要不同的 fourcc,請使用 '-vtag' 選項。例如,'-vtag xvid' 將強制將 fourcc 'xvid' 儲存為視訊 fourcc,而不是預設值。
3.9 哪些是編碼高品質 MPEG-4 的良好參數?
'-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2',可以嘗試的項目:'-bf 2'、'-mpv_flags qp_rd'、'-mpv_flags mv0'、'-mpv_flags skip_rd'。
3.10 哪些是編碼高品質 MPEG-1/MPEG-2 的良好參數?
'-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2',但請注意 '-g 100' 可能會導致某些解碼器出現問題。可以嘗試的項目:'-bf 2'、'-mpv_flags qp_rd'、'-mpv_flags mv0'、'-mpv_flags skip_rd'。
3.11 使用 ffmpeg 編碼交錯式視訊看起來很糟糕,哪裡出錯了?
您應該使用 '-flags +ilme+ildct',並可能為交錯式素材使用 '-flags +alt',如果結果看起來真的很糟,請嘗試 '-top 0/1'。
3.12 我該如何讀取 DirectShow 檔案?
如果您使用 ./configure --enable-avisynth
建置了 FFmpeg(僅在 MinGW/Cygwin 平台上可能),那麼您可以使用 DirectShow 可以讀取的任何檔案作為輸入。
只需建立一個包含以下單行的 "input.avs" 文字檔案...
DirectShowSource("C:\path to your file\yourfile.asf")
... 然後將該文字檔案饋送到 ffmpeg
ffmpeg -i input.avs
如需 AviSynth 的任何其他協助,請造訪 AviSynth 首頁。
3.13 我該如何合併影片檔案?
「合併」影片檔案非常模糊不清。以下列表說明了不同種類的「合併」,並指出了如何在 FFmpeg 中處理這些問題。合併影片檔案可能意味著
- 將它們一個接一個地放置:這稱為串連它們(簡稱:concat),並在本常見問題解答中說明。
- 將它們放在同一個檔案中,讓使用者在不同版本之間進行選擇(範例:不同的音訊語言):這稱為將它們多工在一起(簡稱:mux),只需使用多個 -i 選項調用 ffmpeg 即可完成。
- 對於音訊,將所有聲道放在單一串流中(範例:將兩個單聲道串流合併為一個立體聲串流):這有時稱為合併它們,可以使用
amerge
濾鏡完成。 - 對於音訊,將一個疊加在另一個之上播放:這稱為混合它們,可以先將它們合併到單一串流中,然後使用
pan
濾鏡隨意混合聲道來完成。 - 對於視訊,將兩者一起顯示,並排或一個疊加在另一個的一部分之上;可以使用
overlay
視訊濾鏡來完成。
3.14 我該如何串連影片檔案?
有多種解決方案,具體取決於確切的情況。
3.14.1 使用 concat 濾鏡 串連
FFmpeg 有一個專門為此設計的 concat
濾鏡,文件中提供了範例。如果您需要重新編碼,建議使用此操作。
3.14.2 使用 concat 解多工器 串連
FFmpeg 有一個 concat
解多工器,當您想避免重新編碼並且您的格式不支援檔案層級串連時,可以使用它。
3.14.3 使用 concat 協定 (檔案層級)串連
FFmpeg 有一個專門為此設計的 concat
協定,文件中提供了範例。
少數多媒體容器(MPEG-1、MPEG-2 PS、DV)允許僅通過串連包含它們的檔案來串連視訊。
因此,您可以先將多媒體檔案轉碼為這些特權格式,然後使用普通的 cat
命令(或 Windows 下同樣普通的 copy
),最後轉碼回您選擇的格式,從而串連您的多媒體檔案。
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
此外,您可以使用 concat
協定來代替 cat
或 copy
,這將避免建立潛在的巨大中間檔案。
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
請注意,您可能需要跳脫字元 "|",它對於許多 shell 來說是特殊的。
另一個選項是使用具名管道,如果您的平台支援。
mkfifo intermediate1.mpg mkfifo intermediate2.mpg ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null & ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null & cat intermediate1.mpg intermediate2.mpg |\ ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
3.14.4 使用原始音訊和視訊串連
同樣地,yuv4mpegpipe 格式以及原始視訊、原始音訊編碼器也允許串連,並且轉碼步驟幾乎是無損的。當使用多個 yuv4mpegpipe 時,需要從除第一個串流之外的所有串流中捨棄第一行。這可以通過管道傳輸到 tail
來完成,如下所示。請注意,當通過管道傳輸到 tail
時,您必須使用命令群組 { ;}
才能正確地在背景執行。
例如,假設我們想將兩個 FLV 檔案串連到一個 output.flv 檔案中
mkfifo temp1.a mkfifo temp1.v mkfifo temp2.a mkfifo temp2.v mkfifo all.a mkfifo all.v ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null & ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null & ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null & { ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } & cat temp1.a temp2.a > all.a & cat temp1.v temp2.v > all.v & ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \ -f yuv4mpegpipe -i all.v \ -y output.flv rm temp[12].[av] all.[av]
3.15 使用 -f lavfi,音訊莫名其妙地變成單聲道。
使用 -dumpgraph - 來找出確切的聲道佈局在哪裡遺失。
最有可能的是通過 auto-inserted aresample
。嘗試理解為什麼在那個地方需要轉換濾鏡。
輸出之前是一個可能的位置,因為 -f lavfi 目前僅支援封包化的 S16。
然後在濾鏡圖中顯式插入正確的 aformat
,指定確切的格式。
aformat=sample_fmts=s16:channel_layouts=stereo
3.16 為什麼 FFmpeg 看不到我的 VOB 檔案中的字幕?
VOB 和少數其他格式沒有描述檔案中所有內容的全域標頭。相反,應用程式應該掃描檔案以查看它包含什麼。由於 VOB 檔案通常很大,因此僅掃描開頭。如果字幕僅在檔案稍後出現,則最初不會檢測到它們。
某些應用程式,包括 ffmpeg
命令列工具,只能使用在初始掃描期間檢測到的串流;稍後檢測到的串流將被忽略。
初始掃描的大小由兩個選項控制:probesize
(預設約 5 Mo)和 analyzeduration
(預設 5,000,000 µs = 5 s)。為了檢測到字幕串流,這兩個值都必須足夠大。
3.17 為什麼 ffmpeg
-sameq 選項被移除了?該用什麼來替代?
-sameq 選項表示「相同的量化器」,並且僅在非常有限的情況下才有意義。不幸的是,很多人誤認為它是「相同的品質」,並在沒有意義的地方使用它:它大致達到了預期的可見效果,但以非常低效的方式實現了它。
每個編碼器都有自己的一組選項來設定品質與大小的平衡,使用您正在使用的編碼器的選項將品質等級設定到您口味可接受的點。最常用的選項是 -qscale 和 -qmax,但您應該仔細閱讀您選擇的編碼器的文件。
3.18 我有一個拉伸的影片,為什麼縮放無法修復它?
許多視訊編碼器和格式可以儲存視訊的長寬比:這是完整影像(DAR,顯示長寬比)或個別像素(SAR,樣本長寬比)的寬度和高度之間的比例。例如,解析度為 640×350 的 EGA 螢幕具有 4:3 DAR 和 35:48 SAR。
大多數靜態影像處理都使用方形像素,即 1:1 SAR,但許多視訊標準,尤其是來自類比-數位轉換時代的標準,都使用非方形像素。
FFmpeg 中的大多數處理濾鏡都處理長寬比以避免拉伸影像:裁剪調整 DAR 以保持 SAR 不變,縮放調整 SAR 以保持 DAR 不變。
如果您想拉伸或「取消拉伸」影像,您需要使用 setdar 或 setsar 濾鏡
覆蓋資訊。
不要忘記仔細檢查原始視訊,以檢查拉伸是來自影像還是來自長寬比資訊。
例如,要修復編碼不良的 EGA 擷取,請使用以下命令,第一個命令用於向上縮放到方形像素,第二個命令用於設定正確的長寬比,第三個命令用於避免轉碼(可能無法運作,具體取決於格式/編碼器/播放器/月相)
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
3.19 我該如何在背景工作執行 ffmpeg?
ffmpeg 通常會檢查控制台輸入,以獲取諸如 "q" 以停止和 "?" 以提供幫助之類的條目,同時執行操作。ffmpeg 沒有辦法檢測它何時作為背景工作執行。當它檢查控制台輸入時,可能會導致在背景中執行 ffmpeg 的進程暫停。
為了防止這些輸入檢查,允許 ffmpeg 作為背景工作執行,請在 ffmpeg 調用中使用 -nostdin
選項。無論您是在 shell 中執行 ffmpeg 還是通過作業系統 API 在其自己的進程中調用 ffmpeg,這都是有效的。
作為替代方案,當您在 shell 中執行 ffmpeg 時,您可以將標準輸入重新導向到 /dev/null
(在 Linux 和 macOS 上)或 NUL
(在 Windows 上)。您可以對 ffmpeg 調用或從調用 ffmpeg 的 shell 腳本中執行此重新導向。
例如
ffmpeg -nostdin -i INPUT OUTPUT
或(在 Linux、macOS 和其他類 UNIX shell 上)
ffmpeg -i INPUT OUTPUT </dev/null
或(在 Windows 上)
ffmpeg -i INPUT OUTPUT <NUL
3.20 我該如何防止 ffmpeg 因為類似 suspended (tty output) 的訊息而暫停?
如果您在背景中執行 ffmpeg,您可能會發現其進程暫停。可能會顯示類似 suspended (tty output) 的訊息。問題是如何防止進程被暫停。
例如
% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt & [1] 93352 % [1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
儘管訊息中包含 "tty output",但這裡的問題是 ffmpeg 通常在執行時檢查控制台輸入。作業系統檢測到這一點,並暫停進程,直到您可以將其帶到前台並處理它。
解決方案是使用正確的技術來告訴 ffmpeg 不要查詢控制台輸入。您可以使用 -nostdin
選項,或使用 < /dev/null
重新導向標準輸入。請參閱常見問題解答 我該如何在背景工作執行 ffmpeg? 以獲取詳細資訊。
4 開發
4.1 是否有範例說明如何使用 FFmpeg 函式庫,特別是 libavcodec 和 libavformat?
是的。請查看原始碼儲存庫中的 doc/examples 目錄,也可以在線上找到:https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples。
範例也會預設安裝,通常在 $PREFIX/share/ffmpeg/examples
中。
您也可以閱讀 FFmpeg 文件的開發人員指南。或者,檢查已合併 FFmpeg 的眾多開源專案之一的原始碼 (projects.html)。
4.2 你們可以支援我的 C 編譯器 XXX 嗎?
這取決於情況。如果您的編譯器符合 C99 標準,那麼支援它的補丁很可能會受到歡迎,如果它們不會用與編譯器相關的 #ifdef
污染原始碼。
4.3 是否支援 Microsoft Visual C++?
是的。請參閱 FFmpeg 文件中的 Microsoft Visual C++ 章節。
4.4 你們可以加入 automake、libtool 或 autoconf 支援嗎?
不。這些工具過於臃腫,並且它們使建置變得複雜。
4.5 為什麼不使用物件導向 C++ 重寫 FFmpeg?
FFmpeg 已經以高度模組化的方式組織,並且不需要以正式的物件語言重寫。此外,許多開發人員偏愛直接的 C 語言;它對他們有效。有關此事的更多論點,請閱讀 "Programming Religion"。
4.6 為什麼 ffmpeg 程式缺少除錯符號?
建置過程會建立包含完整除錯資訊的 ffmpeg_g
、ffplay_g
等。這些二進位檔會被剝離以建立 ffmpeg
、ffplay
等。如果您需要除錯資訊,請使用 *_g 版本。
4.7 我不喜歡 LGPL,我可以改在 GPL 下貢獻程式碼嗎?
是的,只要程式碼是可選的,並且可以輕鬆且乾淨地放置在 #if CONFIG_GPL 下,而不會破壞任何東西。因此,例如,在 GPL 下新增編碼器或濾鏡是可以的,而對 LGPL 程式碼的錯誤修復則不行。
4.8 我在我的 C 應用程式中使用了 FFmpeg,但連結器抱怨函式庫本身缺少符號。
FFmpeg 預設建置靜態函式庫。在靜態函式庫中,依賴項不會被處理。這有兩個後果。首先,您必須按依賴順序指定函式庫:-lavdevice
必須在 -lavformat
之前,-lavutil
必須在所有其他函式庫之後,等等。其次,也必須指定 FFmpeg 中使用的外部函式庫。
取得依賴順序中所需函式庫的完整列表的簡單方法是使用 pkg-config
。
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
有關更多詳細資訊,請參閱 doc/example/Makefile 和 doc/example/pc-uninstalled。
4.9 我在我的 C++ 應用程式中使用了 FFmpeg,但連結器抱怨缺少似乎可用的符號。
FFmpeg 是一個純 C 專案,因此要在您的 C++ 應用程式中使用函式庫,您需要明確聲明您正在使用 C 函式庫。您可以通過使用 extern "C"
包含您的 FFmpeg 標頭來完成此操作。
請參閱 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
4.10 我在我的 C++ 應用程式中使用了 libavutil,但編譯器抱怨 'UINT64_C' 未在此作用域中宣告
FFmpeg 是一個純 C 專案,使用 C99 數學功能,為了使 C++ 能夠使用它們,您必須將 -D__STDC_CONSTANT_MACROS 附加到您的 CXXFLAGS
4.11 我有一個記憶體中的檔案 / 一個與 *open/*read/ libc 不同的 API,我該如何將它與 libavformat 一起使用?
您必須使用 avio_alloc_context
建立自訂 AVIOContext,請參閱 FFmpeg 中的 libavformat/aviobuf.c 和 MPlayer 或 MPlayer2 原始碼中的 libmpdemux/demux_lavf.c。
4.12 關於 ffv1、msmpeg4、asv1、4xm 的文件在哪裡?
請參閱 https://www.ffmpeg.org/~michael/
4.13 我該如何將 H.263-RTP(以及 RTP 中的其他編碼器)饋送到 libavcodec?
即使 RTP 因為面向網路而很特殊,但它仍然像任何其他容器一樣。您必須在將有效負載饋送到 libavcodec 之前解多工 RTP。在這種特定情況下,請查看 RFC 4629 以了解應如何完成。
4.14 AVStream.r_frame_rate 是錯誤的,它遠高於幀率。
r_frame_rate
不是平均幀率,它是可以準確表示所有時間戳的最小幀率。所以不,如果它大於平均值,它就沒有錯!例如,如果您混合了 25 和 30 fps 的內容,那麼 r_frame_rate
將為 150(它是最小公倍數)。如果您正在尋找平均幀率,請參閱 AVStream.avg_frame_rate
。
4.15 為什麼 make fate
沒有執行所有測試?
請確保您擁有 fate-suite 範例,並且 SAMPLES
Make 變數或 FATE_SAMPLES
環境變數或 --samples
configure
選項設定為正確的路徑。
4.16 為什麼 make fate
找不到範例?
您的範例路徑中是否碰巧有一個 ~
字元來指示主目錄?該值以 shell 無法展開的方式使用,導致 FATE 找不到檔案。只需將 ~
替換為完整路徑即可。
本文檔於 2025 年 1 月 21 日 使用 makeinfo 生成。
託管由 telepoint.bg 提供