完整的推流代码已经托管到个人的Gitee,如有需要请自取
https://gitee.com/MonsterAKALei/push_video.git
ffmpeg推流摄像头数据
昨天实现用API分别实现了读取摄像头数据并保存
和将本地文件推流到公网
两个功能,所以想着是否可以将这两个功能合并一下,读取摄像头数据后不保存而直接推流到公网
FFmpeg采集摄像头图像并推流(RTSP/RTMP)—开发总结
我的一篇博文《如何用FFmpeg API采集摄像头视频和麦克风音频。。。》已经介绍了如何从视音频采集设备获取数据,并且编码、保存文件到本地。但是,**有些应用并不是把流保存成文件,而是需要发送到网络**的,比如现在很典型的一种应用场景:把流推送到RTSP、RTMP、HLS服务器,由服务器转发给其他用户观看。很多开发者也是调用FFmpeg API来实现推流的,用FFmpeg 做一个推流器很简单,调用流程跟输出文件的基本相同,基于前面博文的例子稍微修改就可以做出一个采集+编码+推流的软件。这里,我先假设读者已经会用FFmpeg API保存或录制文件,但没有实现过推流功能,我将给大家说一下做推流跟录制文件的区别,还有说一下要注意的几个问题,希望能帮助大家在开发推流功能时减少一些问题的出现
上面这个博客里提到了我目前的需求,如红字突出部分,但是其内容讲的是如何将已有文件推流到公网
,还是有区别的
注意到对于RTMP
,AVOutputFormat
是flv
,这对后面的操作有很大的影响
我先将昨天的两个cpp文件做了简单的拼接
transmit_test.cpp
#include <iostream>
#include <string>
extern "C"
{
#include "libavformat/avformat.h"
#include "libavutil/time.h"
#include "libavutil/avutil.h"
#include "libavdevice/avdevice.h"
#include "libavcodec/avcodec.h"
}
using namespace std;
#pragma comment(lib, "avformat.lib")
#pragma comment(lib, "avutil.lib")
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avdevic.lib")
int ff_Error(int errNum)
{
char buf[1024] = {0};
av_strerror(errNum, buf, sizeof(buf));
cout << buf << endl;
return -1;
}
static AVFormatConte