基於流媒體,人臉識別

參考流媒體協議 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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章