ffmpeg推流摄像头数据至公网服务器

您所在的位置:网站首页 现代别墅cad图纸怎么画出来 ffmpeg推流摄像头数据至公网服务器

ffmpeg推流摄像头数据至公网服务器

2024-04-18 06:02| 来源: 网络整理| 查看: 265

完整的推流代码已经托管到个人的Gitee,如有需要请自取

https://gitee.com/MonsterAKALei/push_video.gitffmpeg推流摄像头数据

昨天实现用API分别实现了读取摄像头数据并保存和将本地文件推流到公网两个功能,所以想着是否可以将这两个功能合并一下,读取摄像头数据后不保存而直接推流到公网

FFmpeg采集摄像头图像并推流(RTSP/RTMP)—开发总结

我的一篇博文《如何用FFmpeg API采集摄像头视频和麦克风音频。。。》已经介绍了如何从视音频采集设备获取数据,并且编码、保存文件到本地。但是,**有些应用并不是把流保存成文件,而是需要发送到网络**的,比如现在很典型的一种应用场景:把流推送到RTSP、RTMP、HLS服务器,由服务器转发给其他用户观看。很多开发者也是调用FFmpeg API来实现推流的,用FFmpeg 做一个推流器很简单,调用流程跟输出文件的基本相同,基于前面博文的例子稍微修改就可以做出一个采集+编码+推流的软件。这里,我先假设读者已经会用FFmpeg API保存或录制文件,但没有实现过推流功能,我将给大家说一下做推流跟录制文件的区别,还有说一下要注意的几个问题,希望能帮助大家在开发推流功能时减少一些问题的出现

上面这个博客里提到了我目前的需求,如红字突出部分,但是其内容讲的是如何将已有文件推流到公网,还是有区别的

注意到对于RTMP,AVOutputFormat是flv,这对后面的操作有很大的影响

我先将昨天的两个cpp文件做了简单的拼接

transmit_test.cpp#include #include 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 codec_tag = 0; } cout

但是下面的博客又给了我一些新的思路

linux FFMPEG 摄像头采集数据推流

博客中使用ffmpeg命令进行本地摄像头的推流,而拉流则是通过ffmpeg的API函数编程实现的

然后我去看陆辉东robot_remote_control中的imagetransfer代码,发现也是只有拉流的实现

void ImgTrancefer::transImg(){ av_register_all(); avformat_network_init(); iCtx = avformat_alloc_context(); int ret; ret = avformat_open_input(&iCtx, rtmp_url.data(), NULL, NULL); if(ret != 0){ emit TransIMGLog(QString("open input faild!")); qDebug() streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){ videoStream = i; break; } }

后面则是一些解码和转码输出的内容,所以是不是只要有拉流输出的代码实现就可以呢,这是个问题

中午吃饭的时候问了陆辉东,说是推流也是通过API实现,但在车上

是我自己的疏忽,应该想到推流代码应该在车上才对,还是要多思考

推流的代码在redwallbot-2中的transfer_img包中,确实给我提供了一些思路,最重要的是打破了我的认知误区,H264格式也可以进行RTMP推流

产生这样的认知误区主要还是因为自己盲目自信以及过于相信网络博客中的内容,其实随便检索一下

第一条就说明RTMP可以推H264格式,所以要时刻保持怀疑的态度,对不熟悉的事物要多查多看

陆辉东代码里是订阅摄像头话题,转OpenCV图像格式,然后再编码为H264,最后封装为FLV进行RTMP推流,最重要的有3步

获取摄像头数据,转换为OpenCV图像格式(BGR/BGRA)

通过ffmpeg编码器将OpenCV图像格式编码为H264格式

将H264格式封装为FLV格式进行RTMP推流

其实弄清了分为几个步骤,分别去查相应的解决方法,逐个击破即可

第一步最简单,几乎不用什么新知识,几个参考博客

cv_bridge用于ROS图像和OpenCV图像的转换

第二步也有一些博客,但比较杂,用C++实现的不多,还没有深入研究

OpenCV采集的视频流转化成H264格式裸码流

cv::Mat编码H264

第三步涉及到对H264、FLV等格式的解析,难度较大,代码上也少有较清晰的实现

RTMP 两种方式推流:推H.264、ACC和推FLV封装格式

RTMP推流H.264

H264 推流到RTMP服务器

但是踏破铁鞋无觅处,这样一篇博客从天而降

流媒体解码及H.264编码推流

有一说一真的顶,简直量身定制,我看时间是17年的博客,陆辉东的代码感觉就是在他的基础上改为类实现而已,我再简单优化一下即可

完整的推流代码已经托管到个人的Gitee,如有需要请自取

MonsterLei/push_video

原文链接:ffmpeg推流摄像头数据至公网服务器_ffmpeg 摄像头推流_Prejudices的博客-CSDN博客



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3