在https://blog.csdn.net/fengbingchun/article/details/93975325 中给出了通过旧接口即FFmpeg中已废弃的接口实现通过摄像头获取视频流然后解码并显示的测试代码,这里通过使用FFmpeg中的新接口再次实现通过的功能,主要涉及到的接口函数包括:
1. avdevice_register_all:初始化libavdevice库并注册所有输入输出设备;
2. av_find_input_format:根据输入格式的名字查找AVInputFormat,在测试代码中,windows平台使用”vfwcap”(video for windows capture),linux平台使用”v4l2”(Video4Linux2);
3. avformat_alloc_context:分配AVFormatContext;
4. av_dict_set:设置或重写一个AVDictionary项,测试代码中设置video_size为640x480,设置input_format为mjpeg,这两个设置仅对usb摄像头有效,对windows内置摄像头会crash;
5. avformat_open_input:打开输入流并读取header;
6. avformat_find_stream_info:读取媒体文件的数据包以获取流信息;
7. 通过AVFormatContext中AVStream查找视频/音频流索引,这里在windows10下获取到的编码类型为mjpeg即AV_CODEC_ID_MJPEG,像素格式为yuv422p即AV_PIX_FMT_YUVJ422P;在linux或windows7下获取到的原始编码类型为rawvideo即AV_CODEC_ID_RAWVIDEO,原始像素格式yuyv422即AV_PIX_FMT_YUYV422;由于通过av_dict_set进行了设置,因此编码类型由rawvideo调整成了mjpeg,可见可以通过av_dict_set对usb摄像头的原有配置进行调整;
8. avcodec_find_decoder:由codec ID查找已注册的解码器;
9. avcodec_alloc_context3:分配一个AVCodecContext并设置它的字段为默认值;
10. avcodec_open2:初始化AVCodecContext,由于前面使用avcodec_alloc_context3,因此在调用avcodec_open2之前,需要对AVCodecContext的某些字段进行指定值