參考流媒體協議 https://cloud.tencent.com/developer/article/1461580
參考雷神 https://blog.csdn.net/leixiaohua1020/article/details/42658139
參考海康視頻抓拍與推流 https://www.cnblogs.com/elesos/p/9881690.html
初始化:
//初始化解封裝
av_register_all();
//初始化網絡
avformat_network_init();
avcodec_register_all();
AVFormatContext *ic = NULL; //指定格式
輸入文件操作:
avformat_open_input(&ic,path,0,0); //打開媒體的的過程開始於avformat_open_input
av_read_frame() //從輸入文件中讀取一個AVPacket
流操作:
int fps = 0; //幀率
avformat_find_stream_info(ic,0); //查找文件的格式或索引 (探測)“獲取文件(流)中的信息
AVStream *avStream = ic->streams[i]; //流信息:如視頻:寬高,幀率 如音頻:採樣率,樣本大小,格式
avStream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO //通過codecpar分析它們是音頻還是視頻,以及所有信息的參數(寬高,大小 ,包括codec_id解碼器id)
AVCodec *codec = avcodec_find_decoder(ic->streams[videoStream]->codecpar->codec_id);//通過解碼器id實現軟解碼
codec = avcodec_find_decoder_by_name("h264_mediacodec");//通過名字獲取實現硬解碼
解碼操作:
//解碼器初始化
AVCodecContext *vc = avcodec_alloc_context3(codec);//把上面創建個codec引入
幀數據操作:
AVPacket *avPacket = av_packet_alloc();//包含創建一個對象空間並做初始化
AVFrame *frame = av_frame_alloc();
//發送到線程中解碼
re = avcodec_send_packet(cc, avPacket);//傳遞視頻解碼器
輸出文件操作:
avformat_alloc_output_context2() //初始化輸出視頻碼流的AVFormatContext
avformat_new_stream() //創建輸出碼流的AVStream
avcodec_copy_context() //拷貝輸入視頻碼流的AVCodecContex的數值t到輸出視頻的AVCodecContext
avio_open() //打開輸出文件
avformat_write_header() //寫文件頭(對於某些沒有文件頭的封裝格式,不需要此函數 比如說MPEG2TS)
av_interleaved_write_frame() //將AVPacket(存儲視頻壓縮碼流數據)寫入文件
av_write_trailer() //寫文件尾(對於某些沒有文件頭的封裝格式,不需要此函數。比如說MPEG2TS)