ffmpeg解复用FLV文件
? ? ? ? 該博文是基于:
? ? ? ? ffmpeg:V 5.1.2
????????FLV格式是H2.64視頻和aac音頻復用得到的格式,我們所說的FLV解復用就是將FLV格式的數據的H2.64視頻幀和aac音頻幀分離。
????????分離完成后,音頻是純數據無法播放,需要添加ADTS頭,視頻幀有的格式需要添加起始碼。
????????ADTS頭結構及代碼實現參考:AAC音頻格式ADTS頭詳解
????????起始碼,pps sps等詳細內容參考:H2.64和H2.65編碼區別
????????解復用文件的一般流程:
// 分配上下文,創建一個AVFormatContext對象,需要avformat_free_context釋放空間
ifmt_ctx = avformat_alloc_context();// 打開輸入文件,讀取媒體文件的頭信息,需要調用avformat_close_input關閉句柄
avformat_open_input(&ifmt_ctx, filename, NULL, NULL);//獲取媒體文件的流信息,不會改變文件的邏輯地址
int ret = avformat_find_stream_info(ifmt_ctx, 0);//找到用戶想要尋找的流的信息(音頻流,視頻流,字幕流等),并獲取對應的索引
video_index = av_find_best_stream(ifmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);//創建并且初始化pkt包
pkt = av_packet_alloc();av_init_packet(pkt);//將包數據讀取到pkt中
av_read_frame(ifmt_ctx, pkt);//將包信息送入過濾器進行過濾 獲得有效數據
av_bsf_send_packet(bsf_ctx, pkt);//將包信息從過濾器中讀出,輸入一個包可能輸出多個包,所以需要while一直讀取。
av_bsf_receive_packet(bsf_ctx, pkt);ffmpeg對于文件的數據操作還有一個重要的函數:
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,int flags);????????該函數類似于C庫函數中文件操作函數seek是類似的,用于移動文件指針的偏移位置,該函數可以實現類似播放器中快進,快退的功能。接口應用參考:av_seek_frame接口詳解。
ffmpeg解復用FLV的源碼(源碼已經過驗證):解復用FLV源碼實現
總結
以上是生活随笔為你收集整理的ffmpeg解复用FLV文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽奖随机滚动_如何在party上用来宾的
- 下一篇: qq等级查询