視頻花屏/卡頓緣由
- 若是GOP分組中的P幀丟失會形成解碼端的圖像發生錯誤
- 爲了不花屏問題的發生,通常若是發現P幀或者I幀丟失,就不顯示本GOP內的全部幀,直到下一個I幀來後,從新刷新圖像。
時間基
- tbr: 幀率
- tbn:time base of stream
- tbc:time base of codec
時間戳
- PTS: Presentation timestamp
- DTS: Decoding timestamp
- I(intra)/B(bidirectional)/P(predicted)幀
時間戳順序
- 實際幀順序:I B B P
- 存放幀順序:I P B B
- 解碼時間戳:1 4 2 3
- 展現時間戳:1 2 3 4
從哪兒得到PTS
- AVPacket中的PTS
- AVFrame中的PTS
- av_frame_get_baset_effort_timstamp()
計算當前幀的PTS
- PTS=PTS * av_q2d(video_stream->time_base)
- av_q2d(AVRotional a){ return a.num/(double)a.den }
計算下一幀的PTS
- video_clock: 預測的下一幀視頻的PTS
- frame_delay: 1/tbr
- audio_clock: 音頻當前播放的時間戳
多媒體格式轉換
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv算法
- -i:輸入文件
- vcodec copy:視頻編碼處理方式
- acodec copy:音頻編碼處理方式
該條命令的做用是將視頻文件out.mp4格式轉換爲out.flv,音頻編碼方式保持不變,視頻編碼方式保持不變。框架
錄音命令
ffmpeg -f avfoundation -i :0 out.wav
:0 表明音頻設備
該條命令表示使用AVfoundation框架錄製一段音頻數據,數據來源是麥克風,輸出文件是out.wav,錄製完成以後,使用ffplay out.wav命令進行播放。ide
錄屏命令
ffmpeg -f avfoundation -i 1 r 30 out.yuv編碼
- -f: 指定使用AVfoundation採集數據
- -i: 指定從哪兒採集數據,它是一個文件索引號
- -r:指定幀率
該條命令表示使用AVfoundation框架,以30幀每秒的幀率錄製屏幕,輸出文件是out.yuv。使用ffplay能夠進行播放,可是播放的時候須要制定屏幕尺寸和錄製的數據格式,不然播放不出來。code
ffmpeg濾鏡命令
ffmpeg -i in.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4視頻
crop格式: crop=out_w:out_h:x:yserver
該命令表示對輸入的in.mov文件進行寬和高的裁剪,以原始視頻爲中心進行寬和高分別減去200的裁剪,同時視頻的編碼格式使用libx264,音頻的編碼格式保持不變。索引
文件的刪除與重命名
- avpriv_io_delete()
- avpriv_io_move()
碼流基本概念
- SODB(String Of Data Bits),原始數據比特流,長度不必定是8的倍數,它是由VCL層產生
- RBSP(Raw Byte Sequence Payload,SODB + trailing bits),算法是在SODB最後一位補1,不安字節對齊則補零。
SPS & PPS
- SPS(Sequence Paramter Set),序列參數集,存放幀數,參考幀數目,解碼圖像尺寸,幀場編碼模式選擇標識等。
- PPS(Picture Paramter Set)圖像參數集,存放熵編碼模式選擇標識、片組數目、初始量化參數和去方塊濾波係數調整標識等。
H264壓縮技術
- 幀內預測壓縮,解決的是空域數據冗餘問題
- 幀間預測壓縮,解決的是時域數據冗餘問題
- 整數離散餘弦變換(DCT),將空間上的相關性變成頻域上無關的數據而後進行量化。
- CABAC壓縮。
直播推流/拉流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamNameget
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv直播