写在前面本文将先容以下内容:
I. 推流简介笔者最初听到“推流”时,心里想:“这是什么高端玩意儿?”,迫于项目压力,不能不顶着压力调研和开辟。经过一段时候的进修、开辟和总结,笔者终究大白了推流,究竟是个什么高端玩意儿? 什么是推流?在 科普 | 直播中常说的推流拉流究竟是什么东东?中说: 推流,指的是把收集阶段封包好的内容传输到办事器的进程。实在就是将现场的视频信号传到收集的进程。 用大口语讲,推流就是把当地音视频数据经过收集上传到云端/背景办事器,所谓“收集阶段封包好”,笔者以为是未解码的H264的NALU。 推流的全部阶段以下图,本图一样摘自 科普 | 直播中常说的推流拉流究竟是什么东东?(读者请先疏忽“拉流”这个名词,姑且替换为客户端用户在视频门户网站,如腾讯视频、B站等看收集在线的视频,自然也包括看直播。): 上图从“推流端”到“源站”(同上文所说到的“办事器”),再到CDN分发节点,最初到“播放端”,全部进程的视音频数据,都是紧缩的数据流。也就是说,对视频数据来说,就是H264码流。解码工作是在播放端停止的。 推流的工作不可思议,最多的利用就是直播;而在大大都视频门户网站,笔者今朝也很迷惑,能否存在步调1,从效力上来说,视频数据间接寄存在“源站”,经过CDN按照客户端请求下发,应当便可以了。至于具体做法,有待考证,笔者在这里姑且记一笔吧。 领会了什么是推流以后,下一个题目自然就出来了:应当怎样推流呢?这实在是一个复杂的进程,而且还需方法会”源站“,也就是推流办事器。本文仅触及当地音视频数据经过收集上传到云端/背景办事器的当地音视频上传阶段,所以,先来领会当地的数据是怎样上传的,第一步就是领会推流的协议! 笔者领会到的几个今朝常用的推流协议有:RTMP,HLS,webRTC,HTTP-FLV。本文仅先容RTMP,缘由是:笔者今朝只打仗了RTMP协议的推流工作。 RTMPRTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。是Adobe公司开辟的一个基于TCP的利用层协议,也就是说,RTMP是和HTTP/HTTPS一样,是利用层的一个协议族。RTMP在TCP通道上一般传输的是flv 格式流。请留意,RTMP是收集传输协议,而flv则是视频的封装格式。flv封装格式设想出来的目标是为了用于收集传输利用的,是以RTMP+FLV可以说是”黄金同伴“。 RTMP协议包括:根基协议及RTMPT/RTMPS/RTMPE等多种变种。从视频协议进修:推流拉流都擅长的 RTMP领会到,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}
上文有提到,RTMP一般用flv流数据,是以多设备 接着,另一个根基需求,就是在推流的时辰希望不要加上音频,这个也好实现: ffmpeg -i ${input_video} -vcodec copy -an -f flv rtmp://${server}/live/${streamName}
关于 再有其他的需求,读者可自行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:
以上2个题目都成功定位题目地点:
缘由归结为一个:flv格式最多只能包括一个视频流和一个音频流。 至此,笔者原以为视频封装格式就只是记录了几个无关紧急的参数的认知,完全崩塌。据笔者领会,MP4是可以同时包括多路码流的。看来多媒体/流媒体技术的水还很深呢,还有很多很多地方需要笔者去进修、踩坑、总结呢!自勉自勉。 写在前面文章中有不松散的地方,接待指责。 |
0.引言本篇文章主要讲解RTSP推流实战,整体推流流程与RTMP推流流程类似。如果对于RTSP
随着视频号直播的不断完善,美颜、抽奖、推流直播等功能纷纷上线,【附近的直播和人】
很多人直播间没有人,就是因为搞不懂抖音直播间推流机制。不明白推流机制就找不到正确
思路:opencv读取视频 — 将视频分割为帧 — 将每一帧进行需求加工后 — 将此帧写入pi
500强直播策划,策划过多起直播。经常会遇到需要全平台推流的情况,但是OBS的原生软件
#头条文章养成计划#根据我400多天创作的亲身体验,文章推荐的时间比较长,而微头条的
#头条创作挑战赛#头条推流的机制是怎样的?在头条写作了31天,小编一直被这个问题困扰
Open Broadcaster Software(简称 OBS)是一款好用的第三方开源程序直播流媒体内容制
写在前面本文将介绍以下内容:什么是推流?将介绍推流常见的协议RTMP,HLS等。怎么用f
头条直播换到西瓜后台啦! 推流还是一样方便快捷! 功能更多更
最近有很多同学问我视频号推流直播怎么做,这种三两句话回答不清楚,今天特意写了详
推流:将直播内容推送至服务器的过程拉流:为服务器已有直播内容,用指定地址进行拉取
我是依伊,一个全职写作的创作人,点击右上角关注,为你分享【新媒体写作变现】和【个
用OBS作为电脑直播推流,是很多人使用的一款开源软件。我们使用OBS时,它默认的是只能
你是否也遇到过辛辛苦苦拍了视频,但结果却还不如跳舞的小姐姐?为什么别人随便拍的视
专业直播操盘手必须掌握的OBS推流直播技能私域直播母東東,业绩增长分分钟Hello,各位
想在直播间中直播游戏,那就需要用到2个东西,分别是推流码和obs软件。那抖音直播推流
缘起: 最近工作比较忙、文章也没怎么更新,不过最近 一段时间过来问我视频号问题的朋
随着近几年互联网技术高速发展,人们对社交形式多样化的需求不断增加,从一开始的文字
直播目前处于一个风口期,很多直播开始跨平台跨地域直播,如何实现异地直播,跨平台直
声明:本站内容由网友分享或转载自互联网公开发布的内容,如有侵权请反馈到邮箱 1415941@qq.com,我们会在3个工作日内删除,加急删除请添加站长微信:15314649589
Copyright @ 2022-2044 杭州共生网络 www.gongshengyun.cn Powered by Discuz!