【音视频处理】转封装实战,文件转直播流,FFmpeg代码示例讲解

news2024/11/17 13:36:10

大家好,欢迎来到停止重构的频道。

从本期起,我们正式进入音视频处理的介绍。

本期我们讨论音视频文件转封装,如将MP4转AVI、MP4转RTMP等。

内容中所提及的代码都会放在GitHub,感兴趣的小伙伴可以到GitHub下载。

我们按这样的顺序展开讨论 :

1、  视频封装的作用 

2、  转封装的工作原理

3、  转封装成视频文件 

4、  转封装成直播流 

视频封装的作用 

在前面《音视频转码工作原理》中讨论过,一个视频文件实质上是分3层的,封装、编码、基础数据

封装格式的作用,简单地说,就是对音频数据、视频数据、基础信息等数据,按一定的结构规则编排成文件

数据编排虽然对音视频数据本身不会产生影响,但是会对一些特定场景产生影响。

如视频文件一般会采用MP4、FLV等封装格式,直播流则采用RTMP、HTTP-FLV等协议。

关于MP4、FLV、HLS等视频封装格式的详细说明,可参考往期《视频格式》。

关于RTMP、HTTP-FLV、HLS等流媒体协议的详细说明,可参考往期《直播协议》。 

 

转封装的工作原理

转封装的应用场景有很多,如MP4文件转FLV文件,MP4文件转RTMP直播流, RTMP直播流转MP4文件等。

这里需要注意的是,转封装仅仅是改变文件数据的编排方式。如果需要改变分辨率、码率等设置,则需要转码才能完成。

 

关于转封装、转码的区别,可参考往期《音视频转码工作原理》。

 

转封装的工作原理很简单,就是对视频文件或视频流解封装后按新格式重新封装成视频文件或视频流。

转封装时,音频数据、视频数据不需要区别处理,这个过程是流式的,就是每次只处理一部分数据,循环往复,直到处理完成。

 

另外,如果是视频文件转直播流,则循环过程中需要加上时间间隔,不然会由于推流过快而导致报错。

 

转封装成视频文件

后面是具体的FFmpeg操作过程,对应的示例代码也会同步说明。

转封装成视频文件,如将MP4文件转成FLV文件,对应示例代码为remux_tofile.cpp。环境搭建完后,运行程序如图所示:

 

代码流程为4步。

第一步打开源文件并获取源文件信息;

 

第二步构造输出文件,由于转封装是不需要对音视频数据进行处理的,所以可以直接根据源文件的轨道信息构造输出文件;

 

第三步,处理数据,循环解封装源数据,并封装写入到输出文件,直到源数据读取完成;

 

第四步,关闭输入、输出文件,处理完成后需要先对输出文件写入尾信息才能关闭,不然视频文件可能会出现问题。

 

如果是直播流转成视频文件,那么以上代码也适用,且不需要改动,因为直播流中断或结束时 解封装的API仍然会返回小于0的结果。

如果希望提前中断直播流录制,则需要另找时机对输出文件写入尾信息。

转封装成直播流

转封装成直播流

如将MP4文件转成RTMP流,对应示例代码为remux_tostream.cpp,运行程序如图所示:

 

整体代码与转封装成视频文件的代码是差不多的只是这里追加了时间间隔,防止过快退流产生错误。

这里需要说明的是,解封装出来的packet数据中,含有dts解码时间戳和pts播放时间戳。

我们一般用dts作为计算时间间隔的依据,当然dts需要乘以timebase才是真正的时间 ,timebase为源视频文件对应轨道的timebase。

 

一般dts和pts是相等的,但是如果是H264的b帧等情况的话,则可能存在pts大于dts的情况,所以选用pts作为计算时间间隔依据的话,可能会让直播流卡顿。

我们的示例MP4文件是没有b帧的,所以每一个dts和pts都是相等的。

实际录播场景下,也就是视频文件转直播流场景下,视频文件也不应该存在b帧等使得dts和pts不相等的设置,因为即使程序按dts计算时间间隔,但如果某个帧的pts和dts相差太远 也会造成直播卡顿。

 

如果源文件无法消除b帧,那么单纯的转封装无法保证直播流的流畅,需要加入转码过程才行。但转码是需要消耗更多性能的,如果仅仅为了消除b帧而加入转码过程,则往往得不偿失。

总结

本期内容的代码已经上传Github 需要的朋友可以下载,里面有编译运行环境的搭建说明。

 

如果对FFmpeg环境安装感到困惑,可以参考往期视频《FFmpeg》。 当然,也可以选择我们做好的docker容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据科学与大数据专业好就业么

好不好就业取决于你个人的学习能力和技术水平能否达到企业应聘的要求,最直观的方法就是可以搜下你想要工作城市的应聘要求,然后对应着技术点进行技能提升 猎聘大数据研究院发布了《2022未来人才就业趋势报告》 从排名来看,2022年1-4月各行业…

最强实战,Web自动化测试Python+Selenium3+PO+Yaml+DDT框架封装(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 设计思路 框架采…

23款奔驰C260 L更换内饰最全发光套件,提升车内氛围感

原厂1:1设计,免编程匹配,无损安装,可升级项目: 1、碳纤维中控氛围灯(阿凡达水滴款) 2、发光前风口; 3、发光后风口; 4、发光座椅背气氛灯; 5、中音发光盖板 6、主动…

LGViT : Dynamic Early Exiting for Accelerating Vision

摘要 近年来,在资源有限的边缘设备上高效部署和加速功能强大的视觉变压器(ViTs)已成为一个很有吸引力的任务。虽然早期退出是加速推理的一个可行的解决方案,但大多数工作都集中在自然语言处理(NLP)中的卷积…

1.Kubernetes

文章目录 KubernetesK8S概述作用为什么使用K8S主要功能Kubernetes 集群架构与组件总结: 核心组件Master组件Kube-apiserverKube-controller-managerKube-scheduler工作 配置存储中心etcd Node组件KubeletKube-Proxydocker 或 containerd 总结: 工作流程K…

【电源专题】电压查表法显示电量的原理与缺点

在文章:【电源专题】电量计估计电池荷电状态方法(开路电压法及库仑计法)的差别中我们讲到电量计估计荷电状态的方法。其中开路电压法实现方法较容易,可借着开路电压对应荷电状态查表而得到。 那么为什么能够使用电压查表法去预估电池容量呢?如下所示如果我们往一个有刻度…

SpringBoot复习:(16)TomcatStarter

直接在idea里运行SpringBoot程序时,内嵌的tomcat容器会调用TomcatStarter这个类的onStartup方法。TomcatStarter继承自ServletContainerInitializer 其onStartup方法会调用ServletContextInitializer(不是ServletContainerInitializer)的onStartup方法.…

你玩过Java实现的猜数字小游戏嘛?Let‘s Go

你玩过Java实现的猜数字小游戏嘛?Lets Go 分析过程代码实现小结Time 分析过程 首先:猜数字得有个数字先是吧,随机数获取用的是Math.random()函数 math.random()函数:是取[0,1)之间的随机数 math.random()*100:表示[0,1…

利用鸿鹄快速构建公司IT设备管理方案

需求描述 相信应该有一部分朋友跟我们一样,公司内部有很多各种各样的系统,比如资产管理、CRM、issue管理等等。这篇文章介绍下,鸿鹄是如何让我们的资产系统,按照我们的需求展示数据的。 我们的资产管理系统,是使用开源…

JVM问题

1. jvm运行时区域划分及每个区域的作用 堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器 2. 堆内存分配策略:新生代,老年代,gc时机 • 对象优先分配在Eden区,如果Eden区没有足够的空间进行分配时&am…

消息疯狂堆积!RocketMQ出Bug了?

前言 用过 MQ 的同学,可能会遇到过消息堆积的问题。而肥壕最近也踩上了这个坑,但是发现结果竟然是这么一个意料之外的原因而导致的。 正文 那一晚月黑风高,肥壕正准备踏上回家的路,突然收到告警短信轰炸!“MQ 消息堆…

Redis的基础

一、进入redis 内部 / 关闭 # 方式一: // 进入redis redis-cli // 有密码输入密码 :auth [username] password auth 123456 # 方式二: // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…

【腾讯云 Cloud Studio 实战训练营】云上编程永不宕机,彻底释放电脑物理内存

文章目录 前言一、快速上手1、账号注册2、新建工作空间3、配置工作空间参数4、工作空间展示5、运行飞机大战代码6、运行五子棋代码7、运行贪吃蛇代码 二、空间模板三、应用推荐1、点击 Fork2、等待工作空间启动3、安装 Dependencies4、运行 App 四、注意事项1、openai api key …

【云原生】深入掌握k8s中Pod和生命周期

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

基于dockerfile构建sshd、httpd、nginx、tomcat、mysql、lnmp、redis镜像

一、镜像概述 Docker 镜像是Docker容器技术中的核心,也是应用打包构建发布的标准格式。一个完整的镜像可以支撑多个容器的运行,在Docker的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的…

Android四大组件之服务

为什么要使用服务呢? 从上面的文字说,我们知道这个服务是用于执行长期后台运行的操作。有些时候,我们没有界面,但是程序仍然需要工作。比如说,我们播放音乐,在后台播放音乐。比如说,我们下载任…

SLAM精度测评——EVO进阶再进阶

分别观察单个坐标轴差异 1.1 观察x轴差异 evo_ape tum truth.txt pose.txt -r trans_part -va --plot --plot_mode xz

鲁大师7月新机性能/流畅/久用榜:骁龙8 Gen2领先版亮相,性能跑分再破新高

摘要:iQOO 11S突破上限,红魔8S Pro再创新高 继五月六月,搭载天玑9200的机型相继迎来上市之后,高通也终于按耐不住。 本月所有上市的新机均搭载高通骁龙系列芯片,其中骁龙8 Gen2领先版迎来首次亮相,除了主打…

落地数字化管理,提升企业市场竞争力

数字化企业管理方案是一种利用数字技术和信息系统来提升企业管理效率和运营效果的策略。 潜在的数字化企业管理方案 1、企业资源规划(ERP)系统:建立一个集成的ERP系统来统一管理企业的各项业务流程,包括采购、销售、库存管理、财…

NodeJS版本管理工具——NVM

NodeJS版本管理工具——NVM 准备工作 卸载原 nodejs 版本 1、nvm简介 nvm是一个node版本管理工具,通过它可以安装多种node版本并且可以快速、简单的切换node版本。 2、nvm安装 1、下载链接:https://github.com/coreybutler/nvm-windows/releases 注…