此前写了好几篇ffmpeg源代码分析文章,列表如下:
图解FFMPEG打开媒体的函数avformat_open_input
ffmpeg 源代码简单分析 : av_register_all()
ffmpeg 源代码简单分析 : avcodec_register_all()
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : avcodec_decode_video2()
============================
ffmpeg中的avcodec_decode_video2()的作用是解码一帧视频数据。输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame。
查看源代码之后发现,这个函数竟然十分的简单,源代码如下:
int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt) { int ret; // copy to ensure we do not change avpkt AVPacket tmp = *avpkt; *got_picture_ptr= 0; if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx)) return -1; if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type&FF_THREAD_FRAME)){ int did_split = av_packet_split_side_data(&tmp); apply_param_change(avctx, &tmp); avctx->pkt = &tmp; if (HAVE_THREADS && avctx->active_thread_type&FF_THREAD_FRAME) ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr, &tmp); else { ret = avctx->codec->decode(avctx, picture, got_picture_ptr, &tmp); picture->pkt_dts= avpkt->dts; if(!avctx->has_b_frames){ picture->pkt_pos= avpkt->pos; } //FIXME these should be under if(!avctx->has_b_frames) if (!picture->sample_aspect_ratio.num) picture->sample_aspect_ratio = avctx->sample_aspect_ratio; if (!picture->width) picture->width = avctx->width; if (!picture->height) picture->height = avctx->height; if (picture->format == PIX_FMT_NONE) picture->format = avctx->pix_fmt; } emms_c(); //needed to avoid an emms_c() call before every return; avctx->pkt = NULL; if (did_split) ff_packet_free_side_data(&tmp); if (*got_picture_ptr){ avctx->frame_number++; picture->best_effort_timestamp = guess_correct_pts(avctx, picture->pkt_pts, picture->pkt_dts); } }else ret= 0; return ret; }
从代码中可以看出,通过ret = avctx->codec->decode(avctx, picture, got_picture_ptr,&tmp)这句代码,调用了相应解码器的decode()函数,完成了解码操作。
相关推荐
cmake编译必须下载这个驱动包:opencv_ffmpeg.dll、opencv_ffmpeg_64.dll、face_landmark_model.dat、2019_win_intel64_20180723_general.zip,用cmake编译自己下载很慢,基本都是失败,需要自己动手下载。
1.安装ffmpeg2.安装显卡驱动3.编译hw_decode.c #gcc -o hw_decode hw_decode.c -I/.../include -L/.../lib -lavformat -lavfilter -lavcodec -lswscale -lavutil -lswresample -lpthread -lm -lz -lX11 -lva -lvdpau...
cmake opencv缺少的opencv_ffmpeg.dll 、 opencv_ffmpeg_64.dll、ffmpeg_version.cmake、face_landmark_model.dat文件;下载后放到文件夹即可。
make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_ffmpeg.o] Error 1 make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2 make: *** [all] Error 2 解决办法: 通过...
VC6调用FFMPEG进行H264视频编码,代码大体流程: avcodec_init(); avcodec_register_all(); avcodec_find_encoder(CODEC_ID_H264); avcodec_alloc_context(); avcodec_alloc_frame(); avcodec_encode_video(c, outbuf,...
ffmpeg中使用libavcodec的一个例程,对开发ffmpeg的有帮助
ffmpeg_version.cmake; opencv_ffmpeg.dll; opencv_ffmpeg_64.dll 编译过程中,下载易出错文件,共享给大家
opencv_ffmpeg.dll,opencv_ffmpeg_64.dll,ffmpeg_version.cmake,ippicv_2017u3_win_ia32_general_20170822.zip 我下载 好了分享给大家。
编译opencv3.2+opencv_contrib-3.2时需要的三个文件,它们的MD5 hash分别如下: ...opencv_ffmpeg_64.dll : a423363a6eb76d362ca6c406c96c8db6 opencv_ffmpeg.dll : f081abd9d6ca7e425d340ce586f9c090
编译opencv需要的下载失败的ffmpeg.dll/iipcv/face_landmark_model.dat,放到相应文件夹下
opencv_ffmpeg.dll opencv_ffmpeg_64.dll ffmpeg_version.cmake boostdesc_bgm.i boostdesc_bgm_bi.i boostdesc_bgm_hd.i boostdesc_binboost_064.i boostdesc_binboost_128.i boostdesc_binboost_256.i boostdesc_...
FFmpeg是领先的多媒体框架,能够解码,编码, 转码,复用,解复用,流,过滤和播放人类和机器创造的任何东西(ffmpeg decode video demo.c)
CMake编译OpenCV-4.2.0,需要下载例如opencv_videoio_ffmpeg.dll、opencv_videoio_ffmpeg_64.dll,因为网络原因下载不成功,所以,本人将所有相关文件放到了.cache的文件夹中,只需要利用Cmake选择编译路径和Qt的...
FFplay源代码分析:整体流程图,主要用于学习FFMPEG的play功能
(7) avcodec_decode_video() (8) av_free_packet() (9) av_free() 4. 文件操作: (1) avnew_steam() (2) av_read_frame() (3) av_write_frame() (4) dump_format() 5. 其他函数: (1) avpicture_deinterlace() (2) ...
一个Ffmpeg库打开视频文件的例子,基本包含开发所需要的步骤,并详细说明其作用
C:\MinGW\msys\1.0\home\Administrator\h264
ffmpeg例子.FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。
(7) avcodec_decode_video() (8) av_free_packet() (9) av_free() 4. 文件操作: (1) avnew_steam() (2) av_read_frame() (3) av_write_frame() (4) dump_format() 5. 其他函数: (1) avpicture_deinterlace() (2) ...
详情及使用方法请到:http://blog.csdn.net/m0_37677536/article/details/78769362 查看