首页 网站首页 商业信息 推流 查看内容

视频和视频帧:ffmpeg的RTMP推流

微信营销 2022-11-25 16:05 9341人围观 推流

写在前面

本文将先容以下内容:

  • 什么是推流?将先容推流常见的协议RTMPHLS等。
  • 怎样用ffmpeg做推流,包括cmdcode两种方式。
  • 笔者在开辟推流时碰到的一些坑点。

I. 推流简介

笔者最初听到“推流”时,心里想:“这是什么高端玩意儿?”,迫于项目压力,不能不顶着压力调研和开辟。经过一段时候的进修、开辟和总结,笔者终究大白了推流,究竟是个什么高端玩意儿?

什么是推流?

在 科普 | 直播中常说的推流拉流究竟是什么东东?中说:

推流,指的是把收集阶段封包好的内容传输到办事器的进程。实在就是将现场的视频信号传到收集的进程。

用大口语讲,推流就是把当地音视频数据经过收集上传到云端/背景办事器,所谓“收集阶段封包好”,笔者以为是未解码的H264的NALU。

推流的全部阶段以下图,本图一样摘自 科普 | 直播中常说的推流拉流究竟是什么东东?(读者请先疏忽“拉流”这个名词,姑且替换为客户端用户在视频门户网站,如腾讯视频、B站等看收集在线的视频,自然也包括看直播。):



上图从“推流端”到“源站”(同上文所说到的“办事器”),再到CDN分发节点,最初到“播放端”,全部进程的视音频数据,都是紧缩的数据流。也就是说,对视频数据来说,就是H264码流。解码工作是在播放端停止的。

推流的工作不可思议,最多的利用就是直播;而在大大都视频门户网站,笔者今朝也很迷惑,能否存在步调1,从效力上来说,视频数据间接寄存在“源站”,经过CDN按照客户端请求下发,应当便可以了。至于具体做法,有待考证,笔者在这里姑且记一笔吧。

领会了什么是推流以后,下一个题目自然就出来了:应当怎样推流呢?这实在是一个复杂的进程,而且还需方法会”源站“,也就是推流办事器。本文仅触及当地音视频数据经过收集上传到云端/背景办事器的当地音视频上传阶段,所以,先来领会当地的数据是怎样上传的,第一步就是领会推流的协议!

笔者领会到的几个今朝常用的推流协议有:RTMP,HLS,webRTC,HTTP-FLV。本文仅先容RTMP,缘由是:笔者今朝只打仗了RTMP协议的推流工作。

RTMP

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。是Adobe公司开辟的一个基于TCP的利用层协议,也就是说,RTMP是和HTTP/HTTPS一样,是利用层的一个协议族。RTMP在TCP通道上一般传输的是flv 格式流。请留意,RTMP是收集传输协议,而flv则是视频的封装格式。flv封装格式设想出来的目标是为了用于收集传输利用的,是以RTMP+FLV可以说是”黄金同伴“。

RTMP协议包括:根基协议及RTMPT/RTMPS/RTMPE等多种变种。从视频协议进修:推流拉流都擅长的 RTMP领会到,RTMP协议家属有以下几个点挺风趣,读者们无妨看看:

  1. RTMP工作在TCP之上,默许利用端口1935,这个是根基形状;
  2. RTMPE在RTMP的根本上增加了加密功用;
  3. RTMPT封装在HTTP请求之上,可穿透防火墙;
  4. RTMPS类似RTMPT,增加了TLS/SSL的平安功用;
  5. RTMFP利用UDP停止传输的RTMP;

RTMP就是专门针对多媒体数据流的实时通讯设想出来的一种收集数据传输协议,首要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互办事器之间停止音视频和数据通讯。现在Adobe公司已经不支持了,不外今朝,该协议还在普遍利用。

RTMP具体若何停止握手毗连、传输数据,以及其封装的数据包格式,读者都可以经过各类材料领会到,本文不再赘述。(首要缘由是:笔者还没有深入领会这块常识。捂脸)


II. ffmpeg的rtmp推流

下面将先容2种ffmpeg推流的方式:号令行(cmd)和代码(code)。

号令行(CMD)推流

ffmpeg cmd的参数实在太多,是以这里只先容根本的、以及笔者领会的跟读者们做一个分享。

首先,来看一个将当地视频文件推流到办事器的最根本的号令:

ffmpeg -i ${input_video} -f flv rtmp://${server}/live/${streamName}
  • -i:暗示输入视频文件,后跟视频文件途径/URL。
  • -f:强迫ffmpeg采用某种格式,后跟对应的格式。

上文有提到,RTMP一般用flv流数据,是以多设备-f flv

接着,另一个根基需求,就是在推流的时辰希望不要加上音频,这个也好实现:

ffmpeg -i ${input_video} -vcodec copy -an -f flv rtmp://${server}/live/${streamName}
  • -vcodec:指定视频解码器,v是视频videocodec就是解码器,后跟解码器称号,copy暗示不作解码;
  • -acodec:指定音频解码器,同理,aaudio,后跟解码器称号。an代表acodec none就是去掉音频的意义。

关于a/v的写法很多,除了上面先容的,还有-c:v copy -c:a copy等。

再有其他的需求,读者可自行Google。

代码(code)推流

ffmpeg的c++代码推流,网上也是一搜一大堆。笔者保举雷神的最简单的基于FFmpeg的推流器(以推送RTMP为例),可以满足根本的推流需求。可是笔者在现实利用处景时碰到过几个case,最初总结获得一份相对鲁棒可用的code segment:

AVFormatContext *mp_ifmt_ctx = nullptr;
AVFormatContext *mp_ofmt_ctx = nullptr;
uint64_t start_timestamp; // 获得获得第一帧的时候
// ...

int pushStreaming(AVPacket *pkt, int frm_cnt) {
// 做挑选:由于现实源视频文件能够包括多个音视频码流,这里只拔取一路视频流m_vs_index和一路音频流m_as_index。
if (pkt->stream_index == m_vs_index || pkt->stream_index == m_as_index) {
// 没有pts的视频数据,如未解码的H.264裸流,需要重新计较其pts。
if (pkt->pts == AV_NOPTS_VALUE) {
AVRational time_base = mp_ifmt_ctx->streams[m_vs_index]->time_base;
// Duration between 2 frames (us)
int64_t calc_duration = (double)AV_TIME_BASE /
av_q2d(mp_ifmt_ctx->streams[m_vs_index]->r_frame_rate);
// Reset Parameters
pkt->pts = (double)(frm_cnt * calc_duration) /
(double)(av_q2d(time_base) * AV_TIME_BASE);
pkt->dts = pkt->pts;
pkt->duration = (double)calc_duration /
(double)(av_q2d(time_base) * AV_TIME_BASE);
}

// 笔者在这里省去了delay操纵,读者可按照需求增加。该操纵经过控制推流的速度来减轻推流办事器的压力。
// if (pkt->stream_index == m_vs_index) {
// AVRational time_base = mp_ifmt_ctx->streams[m_vs_index]->time_base;
// AVRational time_base_q = {1, AV_TIME_BASE};
// int64_t pts_time = av_rescale_q(pkt->dts, time_base, time_base_q);
// int64_t now_time = av_gettime() - start_timestamp;
// if (pts_time > now_time) {
// av_usleep((unsigned int)(pts_time - now_time));
// }
// }

//计较延时后,重新指按时候戳
AVRational istream_base = mp_ifmt_ctx->streams[pkt->stream_index]->time_base;
AVRational ostream_base = mp_ofmt_ctx->streams[pkt->stream_index]->time_base;
pkt->pts = av_rescale_q_rnd(pkt->pts, istream_base, ostream_base,
(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt->dts = av_rescale_q_rnd(pkt->dts, istream_base, ostream_base,
(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt->pts = pkt->pts < 0 ? 0 : pkt->pts;
pkt->dts = pkt->dts < 0 ? 0 : pkt->dts;
pkt->duration = (int)av_rescale_q(pkt->duration, istream_base, ostream_base);
pkt->pos = -1;
if (pkt->pts < pkt->dts) {
return 1;
}
// 向推流办事器推送流数据
int ret = av_interleaved_write_frame(mp_ofmt_ctx, pkt);
if (ret < 0) {
return ret;
}
}
return 0;
}

III. 推流碰到的坑

笔者碰到过2个推流失利的case:

  1. 推一个RTSP摄像头的流数据时,一旦翻开该摄像头的音频轨道就会在av_interleaved_write_frame()函数处出错。(返回码不记得了)
  2. 利用英飞拓某几款摄像头推流时,总是失利,返回码显现-33。

以上2个题目都成功定位题目地点:

  1. 操纵职员在翻开音频轨道时总是同时翻开2个音频轨道,只要挑选封闭其中1个音频,顿时便可以推流了;
  2. 这几款摄像头同时包括多个视频码流,似乎他们会经过RTSP同时把多个码流同时传过来;最初在代码中强行过滤视音频码流,只保存一路视频+一路音频便可以了。

缘由归结为一个:flv格式最多只能包括一个视频流和一个音频流


至此,笔者原以为视频封装格式就只是记录了几个无关紧急的参数的认知,完全崩塌。据笔者领会,MP4是可以同时包括多路码流的。看来多媒体/流媒体技术的水还很深呢,还有很多很多地方需要笔者去进修、踩坑、总结呢!自勉自勉。


写在前面

文章中有不松散的地方,接待指责。

高端人脉微信群

高端人脉微信群

人脉=钱脉,我们相信天下没有聚不拢的人脉,扫码进群找到你所需的人脉,对接你所需的资源。

商业合作微信

商业合作微信

本站创始人微信,13年互联网营销经验,擅长引流裂变、商业模式、私域流量,高端人脉资源丰富。

精彩点评
  • 惜颜705 2022-11-25 16:13
    请教下,ffmpeg用命令行如何实现逐帧推送RTSP?我是想试试将实时检测的图片结果,做即时推送。。
  • 崔炫俊献 2022-11-25 16:12
    请问可以实现广域网推流吗?我现在能做到局域网内的两台电脑互相推流,但是跨出localhost的限制,用公网ip还没法实现
  • 阳光里的他 2022-11-25 16:11
    推流就是将视频转成流然后推到服务器上,拉流就是从服务器上拉下来视频流然后转成视频播放
  • 我是的十八簿 2022-11-25 16:10
    你好作者我是一名小白对推流完全不懂请问我该在哪里是推流
  • 极品小处男处v 2022-11-25 16:09
    提供个rtmp推流的简易API,usbcam可以直接用
    https://github.com/gozfree/gear-lib/blob/master/gear-lib/librtmpc/librtmpc.h
  • 痴痴情先生先s 2022-11-25 16:09
    写的很棒 对初学者很友好

查看全部评论>>

相关推荐

详解RTSP推流实战(1)

详解RTSP推流实战(1)

0.引言本篇文章主要讲解RTSP推流实战,整体推流流程与RTMP推流流程类似。如果对于RTSP

视频号推流直播是什么?怎么玩?(附最全操作流程!)

视频号推流直播是什么?怎么玩?(附最全操作流程!)

随着视频号直播的不断完善,美颜、抽奖、推流直播等功能纷纷上线,【附近的直播和人】

抖音直播间推流机制是什么?怎么做能让直播间一直有流量 ... ...

抖音直播间推流机制是什么?怎么做能让直播间一直有流量 ... ...

很多人直播间没有人,就是因为搞不懂抖音直播间推流机制。不明白推流机制就找不到正确

python利用ffmpeg进行rtmp推流直播

python利用ffmpeg进行rtmp推流直播

思路:opencv读取视频 — 将视频分割为帧 — 将每一帧进行需求加工后 — 将此帧写入pi

OBS推流如何实现多平台推流

OBS推流如何实现多平台推流

500强直播策划,策划过多起直播。经常会遇到需要全平台推流的情况,但是OBS的原生软件

这篇微头条是3个月前写的,最近几天被再次推流,它有何特别之处

这篇微头条是3个月前写的,最近几天被再次推流,它有何特别之处

#头条文章养成计划#根据我400多天创作的亲身体验,文章推荐的时间比较长,而微头条的

头条的推流机制,原来是这样的

头条的推流机制,原来是这样的

#头条创作挑战赛#头条推流的机制是怎样的?在头条写作了31天,小编一直被这个问题困扰

在电脑上使用OBS在各大平台 直播 推流的方法

在电脑上使用OBS在各大平台 直播 推流的方法

Open Broadcaster Software(简称 OBS)是一款好用的第三方开源程序直播流媒体内容制

视频和视频帧:ffmpeg的RTMP推流

视频和视频帧:ffmpeg的RTMP推流

写在前面本文将介绍以下内容:什么是推流?将介绍推流常见的协议RTMP,HLS等。怎么用f

西瓜媒体直播教程:30秒学会推流直播

西瓜媒体直播教程:30秒学会推流直播

头条直播换到西瓜后台啦! 推流还是一样方便快捷! 功能更多更

视频号如何推流直播?推流直播详细教程

视频号如何推流直播?推流直播详细教程

​最近有很多同学问我视频号推流直播怎么做,这种三两句话回答不清楚,今天特意写了详

推流与拉流简概

推流与拉流简概

推流:将直播内容推送至服务器的过程拉流:为服务器已有直播内容,用指定地址进行拉取

一篇文章突然停止推流,我只做了2件事,结果收益200元

一篇文章突然停止推流,我只做了2件事,结果收益200元

我是依伊,一个全职写作的创作人,点击右上角关注,为你分享【新媒体写作变现】和【个

OBS直播多平台同时推流解决方法,简单粗暴

OBS直播多平台同时推流解决方法,简单粗暴

用OBS作为电脑直播推流,是很多人使用的一款开源软件。我们使用OBS时,它默认的是只能

3分钟带你了解抖音推流机制!

3分钟带你了解抖音推流机制!

你是否也遇到过辛辛苦苦拍了视频,但结果却还不如跳舞的小姐姐?为什么别人随便拍的视

千万级直播运营必须掌握的OBS推流直播技能

千万级直播运营必须掌握的OBS推流直播技能

专业直播操盘手必须掌握的OBS推流直播技能私域直播母東東,业绩增长分分钟Hello,各位

如何获取抖音直播的推流地址?

如何获取抖音直播的推流地址?

想在直播间中直播游戏,那就需要用到2个东西,分别是推流码和obs软件。那抖音直播推流

视频号问题系列(一):视频号如何开通推流直播

视频号问题系列(一):视频号如何开通推流直播

缘起: 最近工作比较忙、文章也没怎么更新,不过最近 一段时间过来问我视频号问题的朋

玩转直播,直播推流软件你选对了吗?

玩转直播,直播推流软件你选对了吗?

随着近几年互联网技术高速发展,人们对社交形式多样化的需求不断增加,从一开始的文字

直播推流和拉流方法-VLC 播放器专题

直播推流和拉流方法-VLC 播放器专题

直播目前处于一个风口期,很多直播开始跨平台跨地域直播,如何实现异地直播,跨平台直

商业洽谈 文章投递 寻求报道
电话咨询: 15924191378
关注微信