前往小程序,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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenEBS Local Volume 测试
对比Kubernetes Hostpath卷相比,OpenEBS本地PV Hostpath卷具有以下优势:
tanmx
2023/10/18
6380
024.掌握Pod-部署MongoDB
本实验使用StatefulSet部署MongoDB集群,同时每个MongoDB实例使用glusterfs实现永久存储。从而部署无单点故障、高可用、可动态扩展的MongoDB集群。
木二
2019/11/26
1.4K0
Kubernetes 几种存储方式性能对比 (转载)
https://blog.fleeto.us/post/kubernetes-storage-performance-comparison/
Portworx
2019/12/11
3.3K0
k8s系列(6)-Helm
官网介绍安装方案https://helm.sh/zh/docs/intro/install/, 然后安装不上,所以手动安装下
爽朗地狮子
2022/10/20
8160
K8S之按官方Dashboard目录来进行名词扫盲实战
这里与K8S不同的是这里没有SidecarPlus,但是多了Replica Sets,Replication Controllers,Daemon Sets
爽朗地狮子
2022/11/02
4830
使用 OpenEBS 实现 Local PV 动态持久化存储
问卷链接(https://www.wjx.cn/jq/97146486.aspx)
CNCF
2021/01/12
5.7K0
使用 OpenEBS 实现 Local PV 动态持久化存储
k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)
  Kubernetes的卷是pod的一个组成部分,因此像容器一样在pod的规范中就定义了。它们不是独立的Kubernetes对象,也不能单独创建或删除。pod中的所有容器都可以使用卷,但必须先将它挂载在每个需要访问它的容器中。在每个容器中,都可以在其文件系统的任意位置挂载卷。
loong576
2019/09/10
6.4K0
k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)
使用 Thanos 集中管理多 Prometheus 实例数据
原文 https://www.chenshaowen.com/blog/manage-multiple-prometheus-using-thanos.html
陈少文
2022/03/28
2K0
使用 Thanos 集中管理多 Prometheus 实例数据
KubeSphere DevOps 初体验,内置 Jenkins 引擎
KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 支持部署在任何基础设施环境,提供在线与离线安装,支持一键升级与扩容集群,并且各功能组件支持模块化和可插拔的安装。
LinuxSuRen
2020/07/03
2.3K0
vcluster -- 基于虚拟集群的多租户方案
虚拟集群(virtual cluster, 简称 vcluster)是在常规的 Kubernetes 集群之上运行的一个功能齐全,轻量级,隔离性良好的 Kubernetes 集群。虚拟集群的核心思想是提供运行在“真实”Kubernetes 集群之上隔离的 Kubernetes 控制平面(例如 API Server)。与完全独立的“真实“集群相比,虚拟集群没有自己的工作节点或者网络,工作负载实际上还是在底层宿主集群上调度。
Se7en258
2022/12/06
1.5K0
vcluster -- 基于虚拟集群的多租户方案
k8s负载资源StatefulSet工作细节
即我们上篇小作文中deployment创建的nginx pod ,他们是完全一样的,任何一个pod 被移除后依然可以正常工作。由于不依赖外部存储,它们可以被轻易的调度到任何 node 上。
你大哥
2021/10/11
7840
k8s负载资源StatefulSet工作细节
mac 上学习k8s系列(26)ReplicationController、ReplicaSet、StatefulSet
如果说svc、pod、pv等资源是k8s的数据流,那么ReplicationController、ReplicaSet、StatefulSet便是k8s的控制流,可以控制k8s 中pod的副本数和动态伸缩。我们基于以前制作的apple:5678镜像来进行学习。
golangLeetcode
2022/08/02
3370
Prometheus监控神器-Kubernetes篇(一)
本篇使用StorageClass来持久化数据,搭建Statefulset的Prometheus联邦集群,对于数据持久化,方案众多,如Thanos、M3DB、InfluxDB、VictorMetric等,根据自己的需求进行选择,后面会详细讲解针对数据持久化的具体细节。
Kubernetes技术栈
2020/09/09
2K0
使用 MicroK8s 和 OpenEBS 扩展 Kubernetes 存储
OpenEBS 由 CloudByte 研发,这是一家专业做容器化存储的公司,OpenEBS 是其一款开源产品,CloudByte 将其在企业级容器存储的经验付诸到该项目中。这个项目的愿景也很简单,就是让需要持久化存储的工作负载中的存储服务能够直接集成在环境中,存储服务可以自动管理,将存储的细节隐藏起来,就像存储系统是另一套基础架构一样。
张善友
2022/05/14
5750
深入浅出 Kubernetes:StatefulSet 概念理解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
耕耘实录
2019/09/18
6870
tke上如何使用local-volume
kubernetes从1.10版本开始支持local volume(本地卷),workload(不仅是statefulsets类型)可以充分利用本地快速SSD,从而获取比remote volume(如cephfs、RBD)更好的性能。
聂伟星
2022/03/25
9352
k8s系列(4)-MongoDB数据持久化
kubernetes 集群不会为你处理数据的存储,我们可以为数据库挂载一个磁盘来确保数据的安全。
爽朗地狮子
2022/10/20
1.3K0
Kubernetes部署Yapi平台
yapi项目 https://github.com/YMFE/yapi/tags 镜像 https://hub.docker.com/r/jayfong/yapi 创建资源清单 vim yapi.yaml apiVersion: v1 kind: Namespace metadata: name: yapi --- apiVersion: v1 kind: Service metadata: name: mongo namespace: yapi labels: app: mongo
院长技术
2022/03/23
1.6K0
Byconity on Kubesphere
KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。
operator开发工程师
2024/02/03
2860
Byconity on Kubesphere
kubernetes(十一) 存储& statefulset控制器
kubernetes支持持久卷的存储插件: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
alexhuiwang
2020/09/23
7890
kubernetes(十一) 存储& statefulset控制器
推荐阅读
相关推荐
OpenEBS Local Volume 测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档