此前写了好几篇ffmpeg源代码分析文章,列表如下:
图解FFMPEG打开媒体的函数avformat_open_input
ffmpeg 源代码简单分析 : av_register_all()
ffmpeg 源代码简单分析 : avcodec_register_all()
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : avcodec_decode_video2()
============================
FFMPEG打开媒体的的过程开始于avformat_open_input,因此该函数的重要性不可忽视。
在该函数中,FFMPEG完成了:
输入输出结构体AVIOContext的初始化;
输入数据的协议(例如RTMP,或者file)的识别(通过一套评分机制):1判断文件名的后缀 2读取文件头的数据进行比对;
使用获得最高分的文件协议对应的URLProtocol,通过函数指针的方式,与FFMPEG连接(非专业用词);
剩下的就是调用该URLProtocol的函数进行open,read等操作了
以下是通过eclipse+MinGW调试FFMPEG源代码获得的函数调用关系图
可见最终都调用了URLProtocol结构体中的函数指针。
URLProtocol结构如下,是一大堆函数指针的集合(avio.h文件)
typedef struct URLProtocol { const char *name; int (*url_open)(URLContext *h, const char *url, int flags); int (*url_read)(URLContext *h, unsigned char *buf, int size); int (*url_write)(URLContext *h, const unsigned char *buf, int size); int64_t (*url_seek)(URLContext *h, int64_t pos, int whence); int (*url_close)(URLContext *h); struct URLProtocol *next; int (*url_read_pause)(URLContext *h, int pause); int64_t (*url_read_seek)(URLContext *h, int stream_index, int64_t timestamp, int flags); int (*url_get_file_handle)(URLContext *h); int priv_data_size; const AVClass *priv_data_class; int flags; int (*url_check)(URLContext *h, int mask); } URLProtocol;URLProtocol功能就是完成各种输入协议的读写等操作
但输入协议种类繁多,它是怎样做到“大一统”的呢?
原来,每个具体的输入协议都有自己对应的URLProtocol。
比如file协议(FFMPEG把文件也当做一种特殊的协议)(*file.c文件)
URLProtocol ff_pipe_protocol = { .name = "pipe", .url_open = pipe_open, .url_read = file_read, .url_write = file_write, .url_get_file_handle = file_get_handle, .url_check = file_check, };
或者rtmp协议(此处使用了librtmp)(librtmp.c文件)
URLProtocol ff_rtmp_protocol = { .name = "rtmp", .url_open = rtmp_open, .url_read = rtmp_read, .url_write = rtmp_write, .url_close = rtmp_close, .url_read_pause = rtmp_read_pause, .url_read_seek = rtmp_read_seek, .url_get_file_handle = rtmp_get_file_handle, .priv_data_size = sizeof(RTMP), .flags = URL_PROTOCOL_FLAG_NETWORK, };
可见它们把各自的函数指针都赋值给了URLProtocol结构体的函数指针
因此avformat_open_input只需调用url_open,url_read这些函数就可以完成各种具体输入协议的open,read等操作了
相关推荐
我自己写的avformat_open_input函数的解析,需要了解ffmpeg源码结构的可以看一下
修改了下example中的remuxing.c, 读取管道里的数据进行处理,注意事项已经编译命令放到文件的开头
录制电脑屏幕操作,基于ffmpeg库使用C++程序开发的。电脑上需要安装x11grab。
CMake编译OpenCV-4.2.0,需要下载例如opencv_videoio_ffmpeg.dll、opencv_videoio_ffmpeg_64.dll,因为网络原因下载不成功,所以,本人将所有相关文件放到了.cache的文件夹中,只需要利用Cmake选择编译路径和Qt的...
FFMPEG_SDL_MFC_PLAYER_1
audacity3.0.0搭配ffmpeg库使用,audacity的偏好设置->ffmpeg库选择avformat-55.dll即可配置完成。
ffmpeg_version.cmake; opencv_ffmpeg.dll; opencv_ffmpeg_64.dll 编译过程中,下载易出错文件,共享给大家
avformat_open_input() avformat_find_stream_info() av_find_best_stream() avcodec_find_decoder() avcodec_parameters_to_context() avcodec_open2() //循环执行 av_read_frame() avcodec_send_packet...
C# ffmpeg.autogen 拉流
ffmpeg资源
ffmpeg 5.0.1 基础版,适用于 windows操作系统
测试搭建appium环境,appium-doctor检查时报WARN AppiumDoctor ffmpeg cannot be found解决办法
simplest_ffmpeg_player_su_雷神_player_ffmpeg_FFMPEG雷_SDL2_源码.zip
cmake opencv缺少的opencv_ffmpeg.dll 、 opencv_ffmpeg_64.dll、ffmpeg_version.cmake、face_landmark_model.dat文件;下载后放到文件夹即可。
ffmpeg windows安装包,不需要编译,直接可以使用
实现了对固定时间开始解码的功能,使用av_seek_frame函数,讲解过程。学习ffmpeg的必备资料
cmake编译必须下载这个驱动包:opencv_ffmpeg.dll、opencv_ffmpeg_64.dll、face_landmark_model.dat、2019_win_intel64_20180723_general.zip,用cmake编译自己下载很慢,基本都是失败,需要自己动手下载。
基于ffmpeg的视频解码类,支持OpenCV的IpliImage的视频帧输出, 由用户释放IplImage内存
希望opencv_ffmpeg,opencv_ffmpeg_64的下载配置文件帮助不能直接下载的人,感谢大家的支持
需要先创建推流的流媒体地址,然后再创建一个对象启动推流,创建过程如下。 RtmpPublishManager* rpm = new RtmpPublishManager("rtmp://192.168.16.88:1935/hls/test0", read...rpm->ffmpeg_init(NULL); rpm->start();