天天看點

ffmpeg 轉碼FFmpeg正常處理流程轉碼過程中的時間戳處理

FFmpeg正常處理流程

ffmpeg 轉碼FFmpeg正常處理流程轉碼過程中的時間戳處理

大流程可以劃分為輸入、輸出、轉碼、播放四大塊。其中轉碼涉及比較多的處理環節,從圖中可以看出,轉碼功能在整個功能圖中占比很大。轉碼的核心功能在解碼和編碼兩個部分,但在一個可用程式中,編碼解碼與輸入輸出是難以分割的。解複用器為解碼器提供輸入,解碼器會輸出原始幀,對原始幀可進行各種複雜的濾鏡處理,濾鏡處理後的幀經編碼器生成編碼幀,多路流的編碼幀經複用器輸出到輸出檔案。

轉碼過程中的時間戳處理

在封裝格式進行中,不深入了解時間戳也沒有關系。但在編解碼進行中,時間戳處理是很重要的一個細節,必須要搞清楚。

容器(檔案層)中的時間基(AVStream.time_base)與編解碼器上下文(視訊層)裡的時間基(AVCodecContex.time_base)不一樣,解碼編碼過程中需要進行時間基轉換。

視訊按幀進行播放,是以原始視訊幀時間基為 1/framerate。視訊解碼前需要處理輸入 AVPacket 中各時間參數,将輸入容器中的時間基轉換為 1/framerate 時間基;視訊編碼後再處理輸出 AVPacket 中各時間參數,将 1/framerate 時間基轉換為輸出容器中的時間基。

音頻按采樣點進行播放,是以原始音頻幀時間為 1/sample_rate。音頻解碼前需要處理輸入 AVPacket 中各時間參數,将輸入容器中的時間基轉換為 1/sample_rate 時間基;音頻編碼後再處理輸出 AVPacket 中各時間參數,将 1/sample_rate 時間基轉換為輸出容器中的時間基。如果引入音頻 FIFO,從 FIFO 從讀出的音頻幀時間戳資訊會丢失,需要使用 1/sample_rate 時間基重新為每一個音頻幀生成 pts,然後再送入編碼器。

解碼前的時間基轉換:

編碼後的時間基轉換: