近期看了一些关于ffmpeg 推流的文章,但是文章中都是基于ffmpeg命令行实现的,觉得不是很灵活,不好和easydarwin 集成到一起工作。于是自己基于ffmpeg 的lib 实现了,采集,编码,推流的过程
ffmpeg 可以支持多种方式的采集,如windows 下的dshow,采集桌面的
gdigrab,linux下有video4linux2 等方式采集。我在windows 下实现的是dshow 设备的采集。
实现的过程如下
1、使用avformat_alloc_context分配一个AVFormatContext 一个结构。
2、使用av_find_input_format 查找dshow 的输入是否存在 如AVInputFormat *ifmt = av_find_input_format("dshow"),此时如果dshow 没有被编译进ffmpeg ,ifmt 等于NULL
3、使用avformat_open_input 打开输入流 avformat_open_input(&pFormatCtx, strUtf8.c_str(), ifmt, &options) ,注意此处,输入的设备名称一定要utf 8 编码的设备名称,否则在中文设备名称下会导致打开设备失败。
4、avformat_find_stream_info 解析流名称,找到输出流的一些格式信息,这个和用ffmpeg 打开视频文件类似。
5、 avcodec_find_decoder 基本上来说是解析具体的图像帧格式,一般是YUV420 或者YUV422 格式,
6、 分配YUV数据的缓冲区 pFrameYUV = av_frame_alloc()
7、初