日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ffmpeg解复用FLV文件

發布時間:2023/12/16 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。