Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >音频缺失录制分析

音频缺失录制分析

原创
作者头像
onexie
发布于 2020-01-20 01:53:22
发布于 2020-01-20 01:53:22
1.4K0
举报
文章被收录于专栏:谢金运的专栏谢金运的专栏

实验框架:

实验框架
实验框架

RTMP Reader和Muxing各自包含音视频的AVCodecContext,共四个AVCodecContext

背景:

用户实际推流过程中,存在推流无音频数据的异常场景,导致录制RTMP Reader无法正确初始化音频的AVCodecContext,进而影响录制Muxing音频AVCodecContext初始化,最终导致录制文件出现静音等问题。

正常的音频推流过程是:AAC Sequence header | AAC data | AAC data | …… | AAC data

场景1:视频包正常推送,音频包则只推送AAC Sequence header,对应推流端代码是

1.正常初始化推流端RTMP Reader的音视频AVCodecContext

2.正常初始化推流端Muxing的音视频AVCodecContext

3.调用avformat_write_header

4. RTMP Reader读取音频视频包,Muxing写视频包,丢弃音频包

抓包如下:

抓包
抓包

红框中包含on mata data和视频的sps/pps以及音频的AAC Sequence header

结果:

录制RTMP Reader堵塞于avformat_find_stream_info直至超时返回,此时RTMP Reader的音视频AVCodecContext均已存在,但是音频AVCodecContext并未正确初始化,音频AVCodecContext如下:

AVCodecContext
AVCodecContext

红框的重要信息中只有bit_rate存在了,其他全未被初始化,用该音频AVCodecContext初始化Muxing的音频AVCodecContext时,ffmpeg会报错:

ffmpeg报错
ffmpeg报错

此时若忽略音频的AVCodecContext,可以正常录制静音文件,这样做存在的问题是若后续推送了正常的音频数据,也会被录制端忽略。

场景2:视频包正常推送,音频包完全不推送,对应推流端代码是

1.正常初始化推流端RTMP Reader的音视频AVCodecContext

2.正常初始化推流端Muxing的视频AVCodecContext,初始化音频AVCodecContext为0,不打开音频stream

3.调用avformat_write_header

4. RTMP Reader读取音频视频包,Muxing写视频包,丢弃音频包

抓包如下:

抓包
抓包

红框看到只有on mata data和video的sps/pps,没有audio的AAC Sequence header

结果:

录制RTMP Reader堵塞于avformat_find_stream_info直至超时返回,此时RTMP Reader的视频AVCodecContext已生成并初始化,而音频AVCodecContext指针则为0,忽略音频录制则静音录制。缺点同场景1。

场景3:视频包正常推送,音频包以及aac sequence header均延迟推送,该场景需要修改rtmp server的代码实现,对应的代码实现是

1.推流端初始化时推送aac sequence header,音频数据则延迟推送

2.rtmp server接收到aac sequence header先进行保存,等到第一个音频数据包达到再一起推送给录制模块,实现均延迟的效果

录制中途,日志有(ffmpeg发现了上行音频stream):

结论同场景2.

场景4:视频包正常推送,音频包只发送数据,不发送aac sequence header,代码实现:

1.rtmp server接收到aac sequence header直接丢弃,只发送后续音频数据包

该场景实际是会影响音频AVCodecContext的extradata的初始化,该场景中,录制代码对录制hls和非hls有不同的做法,录制hls时,放弃录制音频,其他格式则依旧使用无extradata的AVCodecContext录制。

本实验也对该场景做了详细实验:

1.录制flv/mp4时,无extradata也可以正常录制音频数据,播放正常;

2.录制hls时,若强制使用无extradata的AVCodecContext进行录制,则会core掉(这也是录制代码当时要区分hls与非hls录制逻辑的原因);

录制优化:

当前版本,录制初始化设置获取音视频AVCodecContext超时时间为90秒,并有重试逻辑,获取3次不成功就会减少超时时间,最终还不成功则忽略音频AVCodecContext,直接录制静音视频。实验过程中发现,以上3种场景,只要推流端之后能正确推音频数据上来,录制中使用avformat_open_input得到的AVFormatContext中的音频AVCodecContext都会被正确初始化。意味着,如果录制途中再去获取音频的AVCodecContext是可以获取到的,这刚好适用于录制hls的场景,因为录制每次切ts分片的时候都会重新调用setup muxing。

优化效果:

假定,m3u8里有两个ts分片,1.ts和2.ts,1.ts不含音频数据,2.ts含有音频数据(优化的结果)。

ffplay/potplay/hls.js 播放全程静音

ios 1分钟前静音,1分钟后正常同步音频

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
音视频基础概念合集:148 个问题带你快速上车音视频丨音视频基础
音视频是一个有一定技术门槛的垂直领域,对于前端、iOS/Android 客户端、服务端开发同学来说,这都是一个不错的职业发展方向。对于刚开始接触音视频开发的同学,最头疼的问题应该是音视频纷繁庞杂的概念,如果删繁就简,音视频生产及消费的核心环节其实只有:采集(声音和图像的数字化) → 编码(压缩数据便于存储和传输) → 封装(按格式封装便于控制音视频的展现) → 传输(用于网络) → 解封装(封装的逆过程) → 解码(编码的逆过程) → 渲染(声音和图像的展现)。
关键帧
2022/06/13
1.2K0
音视频基础概念合集:148 个问题带你快速上车音视频丨音视频基础
FFmepg 核心开发库及重要数据结构与API
本文介绍 FFmpeg 骨架:“八大金刚” 核心开发库,重要数据结构与 API
Gnep@97
2023/11/28
3920
FFmepg 核心开发库及重要数据结构与API
GB28181和RTSP使用场景区别有哪些?
好多开发者纠结,到底使用GB28181还是RTSP,这里简单的谈下二者使用场景区别,GB28181和RTSP(Real-Time Streaming Protocol)是用于视频监控和流媒体传输的两种不同的协议。
音视频牛哥
2023/10/31
2.8K0
GB28181和RTSP使用场景区别有哪些?
视频直播| 基础原理篇
一、直播难与易 `直播难`:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多, 视频/音频处理,图形处理, 视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的。 `直播易`:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架, 就能快速的搭建一个直播app,也就是传说中的站在大牛肩膀上编程。 二、直播相关概述 1.一个完整直播app功能 1、`聊天` 私聊、聊天室、点亮、推送、黑名单
進无尽
2018/09/12
7.3K0
视频直播| 基础原理篇
GB28181设备接入模块和轻量级RTSP服务有什么区别?
好多开发者在跟我们沟通直播模块的时候,对GB28181设备接入和RTSP模块特别是轻量级RTSP服务,区分不清楚,不知道分别用在什么场景下。针对这个问题,我们做个简单的探讨。
音视频牛哥
2024/07/16
2150
GB28181设备接入模块和轻量级RTSP服务有什么区别?
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
本文由蘑菇街前端开发工程师“三体”分享,原题“蘑菇街云端直播探索——启航篇”,有修订。
JackJiang
2022/05/31
5.3K1
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
视频直播之基础原理
SDK(Software Development Kit): 软件开发工具包 CDN(Content Delivery Network):内容分发网络
全栈程序员站长
2022/09/15
3.1K0
视频直播之基础原理
ffmpeg实战实现音视频解封装!
大家好,很长一段时间没有继续更新ffmpeg的相关技术文章了,最近更多的时间和精力主要集中在给自己不断灌入新的知识,所以接下来只要有时间就会疯狂输出所学习到的技术干货!
用户6280468
2022/03/21
1.1K0
ffmpeg实战实现音视频解封装!
HTTP-FLV详解及分析
传统的直播协议要么使用 Adobe 的基于 TCP 的 RTMP 协议, 要么使用 Apple 的基于 HTTP 的 HLS 协议。本文介绍另外一种结合了 RTMP 的低延时, 以及可以复用现有 HTTP 分发资源的流式协议 HTTP-FLV。
Gnep@97
2023/11/12
2.1K0
HTTP-FLV详解及分析
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
C++实现RTMP协议发送H.264编码及AAC编码的音视频   RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等。RTMP协议可用于实现直播、点播应用,通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServer,可实现摄像
hbstream
2018/05/11
1.7K0
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
  RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系Flash Player和RtmpServer,如FMS, Red5, crtmpserver等。RTMP协议可用于实现直播、点播应用,通过FMLE(Flash Media Live Encoder)推送音视频数据至RtmpServer,可实现摄像头实时直播。不过,毕竟FMLE应用范围有限,想要把它嵌入到自己的程序中,还是要自己来实现RTMP协议的推送。本人实现了一个RTMPLiveEncoder,通过采集摄像头视频和麦克风音频,并进行H.264和AAC编码,然后发送到FMS和crtmpserver上,实现实时直播,可以通过flash player正常观看,目前效果良好,延迟时间在2秒左右。本文就介绍一下RTMPLiveEncoder的主要思路和关键点,以期对需要这方面技术的朋友有所帮助。
hbstream
2018/06/21
2K0
C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
【C++】FFmpeg:音视频库介绍与使用示例
FFmpeg是一款开源的音视频库,提供了处理音视频文件、转码、解码、编码、播放等功能。它是一个完整的跨平台解决方案,支持多种音视频格式,并提供多种API和工具来处理音视频数据。
DevFrank
2024/07/24
6520
FFmpeg学习笔记汇总
FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
天天Lotay
2022/11/14
1.3K0
FFmpeg学习笔记汇总
FFmpeg代码导读——基础篇
视频流媒体中程中视频数据的传输占据了绝大部分的带宽,如何提升编码效率,使用更少的带宽,提供更优质的画面质量,是音视频开发人员一直努力的重点。HEVC(High Efficiency Video Coding,也叫H.265)编码格式的推出,给这一方向带来了突破点,但由于其算法复杂度较高,前期未曾得到普遍应用,而随着移动设备计算能力的提高和越来越多的设备开始支持HEVC的硬件编/解码,直播平台也开始逐渐引入HEVC视频格式。
LiveVideoStack
2021/09/02
1.4K0
FFmpeg代码导读——基础篇
69 篇文章带你系统性的学习音视频开发(收藏起来假期看)
距离我们发出第一篇音视频技术文章已经过去一年了,回顾这一年,我们发了几十篇文章,覆盖了音视频基础知识、工具使用、工程示例、实战经验等主题,这些文章基本上构成了入门音视频开发并做一些功能实现和指标优化工作所需要的知识框架,这里我们来回顾下这些文章,做一下内容简介,给需要的朋友提供一些指引。
关键帧
2023/02/14
3.4K0
69 篇文章带你系统性的学习音视频开发(收藏起来假期看)
一文详解GB28181、RTSP、RTMP
GB28181 即 GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》。它是公安部提出的公共安全行业标准,在视频监控领域具有重要地位。
音视频牛哥
2024/09/24
4.8K0
一文详解GB28181、RTSP、RTMP
Windows平台RTMP/RTSP直播推送模块设计和使用说明
好多开发者一直反馈,Windows平台,做个推屏或者推摄像头,推RTMP或者RTSP出去,不知道哪些功能是必须的,哪些设计是可有可无的,还有就是,不知道如何选技术方案,以下是基于我们设计的Windows平台RTSP、RTMP直播推送模块,设计和使用说明,供大家参考。
音视频牛哥
2020/03/02
3K0
【Dev Club 分享】H5 视频直播那些事
Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。 本期,我们邀请了腾讯SNG Web前端开发工程师——吕鸣,为大家分享《H5 视频直播那些事》。 分享内容简介: 目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要技术点也要有所了解,本次分享就向大家介绍一下其中的奥秘。 内容大体框架: 怎样利用H5来播放直播视频 怎样录制直播视频 怎样实时上传
腾讯Bugly
2018/03/23
1.7K0
实时音视频 TRTC 常见问题汇总---咨询问题篇
支持的平台包括 iOS、Android、Windows(C++)、Windows(C#)、Mac、Web、Electron、微信小程序、Flutter,更多详情请参见 平台支持。
腾讯视频云-Zachary
2019/11/01
13.2K0
实时音视频 TRTC 常见问题汇总---咨询问题篇
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
​自从互联网普及之后,用于视频直播的流媒体技术就发展起来。这几十年中,比较有影响的主要有MMS、RTSP、RTMP、HLS、SRT、RIST几种,分别介绍如下。
aqi00
2024/09/01
2680
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
推荐阅读
相关推荐
音视频基础概念合集:148 个问题带你快速上车音视频丨音视频基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档