1. 程式人生 > >FFmpeg音訊轉碼總結

FFmpeg音訊轉碼總結

最近自己在做音訊轉碼的事情。剛開始是想通過ffmpeg的示例程式來學習,可是比較複雜,短時間內看的頭昏腦脹。索性在網上搜索關於轉碼的例子。還是在雷神的部落格裡找到了類似的示例程式,地址是:http://blog.csdn.net/leixiaohua1020/article/details/26838535

這個示例程式是呼叫ffmpeg中aviflter的模組來進行做的。進行轉碼只是avfilter的一部分功能,關鍵的規則是濾鏡規則,這個是沒有用到的。ffmepg音訊規則的描述是: filter_spec = "anull"(意思是對音訊資料不進行任何操作);視訊的話是: filter_spec = "null"

;作用是相同的。之前我找不到如何使用濾鏡規則,其實關鍵點就在於filter_spec內,用來描述如何使用濾鏡規則的。濾鏡規則先說到這吧,還是先進行轉碼吧。

之後自己進行嘗試,是進行轉碼的,不是隻是適用幾種(mp3,aac,wav等)的音訊格式。使用另外一些音訊轉碼的時候,會出現more samples than frame size (avcodec_encode_audio2)  的問題。究其原因,還是在於轉碼前後,音訊檔案中取樣個數的不同。在網上搜索解決辦法,顯示的都是呼叫ffmpeg中fifo管道來做。官網上有相應的示例程式(transcode_acc.c)。網上的做法是resample模組+fifo管道來做的,可是自己先前是呼叫ffmepg中avfilter模組來做的。自己想了一個辦法, 把要轉碼的檔案先解碼塞進管道,然後resample,之後放入avfilter來處理,然後取出資料在進行編碼。可是,行不通。當自己重取樣之後, 把資料放入avfilter中的時候,出現錯誤:不能對解碼的資料進行resample。自己又白忙活了,之後,還是決定重新利用官網上的例子來做,放棄了avfilter模組的示例程式。

自己先嚐試跑通程式,可是老是出現錯誤,自己開始懷疑官網的示例程式是否可行。之後,實在是編譯不同,沒辦法,利用這種思想自己來寫程式。之後,自己倒是寫出來了,程式試跑沒問題沒有出現之前的的問題。說明程式還是可行的,可是老是編譯官網程式通不過,有點鬱悶。

大體上,自己使用ffmpeg進行轉碼也就到此為止了。希望對大家有幫助吧。

總結一下,通過這次的鍛鍊發現,要解決問題,還是先百度一下為好。

第一,畢竟肯定有人做過的,至少大致的思路不會錯,如果思路錯了,那就會耗費很長時間的。之前,自己專研ffmpeg.c的原始碼,看的是頭昏腦漲,既浪費時間,又浪費精力,在網上查詢的不到半天,就找到了解決的辦法了。

第二,很多東西,都是從陌生到熟悉的,所以自己得慢慢地自己摸索,然後慢慢熟悉。還要,切記一點,要儘可能的理解程式原始碼,只有徹底理解了,才不會出現理解上的偏差,之前自己就是隻圖個理解的大概,所以程式老是小問題不斷,大問題沒有,這是作為程式設計師不應該有,不雅怕浪費時間。