解決ffmpeg 重取樣中的bug。

2021-07-26 08:01:11 字數 964 閱讀 1770

專案需要對ts流進行監控,首先由硬體採集到線路中(有線電視網)的ts流輸出到(ip)網路中接收,於是我使用了ffmpeg的解碼部分和音訊重取樣部分。

具體流程 ts流復合流---->解復用模組--->按照pid demux --->ffmpeg接收--->解碼--->通過pcm資料計算音量--->選擇一路監聽。

實現過程比較簡單,這裡就不具體展開了,具體參考雷博士 解碼部分。

完成基本的**開發以後,提交給業務開發人員進行整合,提交給測試,發現程式在執行一段時間以後會崩潰,拿到dump 分析了以後發現是空指標錯誤,崩潰在了swresample.dll 中。

崩潰的堆疊

抓full dump 發現了第一現場。

在ffmpeg 的 libswresample 中rematrix.c 中 int swri_rematrix(swrcontext *s, audiodata *out, audiodata *in, int len, int mustcopy) 從堆疊中可以看出 ch_count =2  而ch這個陣列,ch[0] 上的值是有的,但是ch[1] 卻是等於null ,因此這個音訊流是單聲道(做硬體的部門已經告知是單聲道了)。但是卻是 ch_count =2 (立體聲)。因此可以斷定是由於ch_count=2,導致了訪問ch[1] 的null,然後崩潰了。

解決方案 修改ffmpeg,當ch陣列與ch_count 狀態不符的情況下返回錯誤。拋掉了當前處理的音訊。外部程式通過判斷返回值進行相應的處理,於是程式就沒在崩潰過了。

最後 我思考為什麼會出現這種問題,我猜想是因為硬體部門可能採集 和重新封裝的ts流的時候,沒有處理好,導致pes 頭裡面的資訊和實際對不上導致。



音訊重取樣的實現

在聲紋識別中,為了滿足對不同取樣率的要求,常需要對語音進行重取樣。重取樣即將原始的取樣頻率變換為新的取樣頻率以適應不同取樣率的要求。實現重取樣的傳統方法有三種 一是若原模擬訊號x t 可以再生,或是已記錄下來,那麼可以進行重新取樣 二是將 x n 通過數模轉換 d a變成模擬訊號 x t 對x t ...

pandas的resample重取樣

pandas中的resample,重新取樣,是對原樣本重新處理的乙個方法,是乙個對常規時間序列資料重新取樣和頻率轉換的便捷的方法。降取樣 高頻資料到低頻資料 公升取樣 低頻資料到高頻資料 主要函式 resample pandas物件都會有這個方法 引數說明 freq 表示重取樣頻率,例如 m 5mi...

pandas的resample重取樣的使用

pandas中的resample,重新取樣,是對原樣本重新處理的乙個方法,是乙個對常規時間序列資料重新取樣和頻率轉換的便捷的方法。降取樣 高頻資料到低頻資料 公升取樣 低頻資料到高頻資料 主要函式 resample pandas物件都會有這個方法 resample方法的引數 引數說明 freq 表示...