音视频的编码格式与封装格式

音视频的编码格式与封装格式是两个不同的概念,视频封装格式常见的有:mp4,rmvb,avi,mkv,mov,mpg,vob,3gp,asf,rmvb,wmv,divx,flv,ts/ps,rm,webm,dat,mpeg,ogg,这些视频封装格式是包裹了音视频编码数据的容器,把特定编码标准编码的视频流和音频流混在一起。在移动端一般将视频封装为mp4格式,mp4支持H.264, H.265等视频编码和acc,mp3等音频编码。

封装简单来说就是将已经编码压缩好的视频轨和音频轨按照一定格式放在一个文件中。

封装格式也被称作多媒体容器,将已处理好的视频和音频或字幕都包装到一个文件容器内,这个过程就叫封装。封装会按照一定的规则把音视频、字幕等数据组织起来,播放器就可以按照这些信息来匹配解码器、同步音视频。

不同的封装格式支持的音视频编码格式是不一样的,如mkv封装格式支持的音视频编码比较多,rmvb则较少。封装格式并不会影响视频的画质,影响画面质量的是视频的编码格式,一个完整的视频文件是由视频、音频、字幕等组成的。用专业的术语来讲,像mp4,ts,flv等封装格式将视频、音频、字幕等合成一个文件,这里的合成就是复用器,示意图如下:
请添加图片描述
音视频封装的流程:

  1. 编码好的视频、音频数据:利用给定的YUV数据编码得到某种视频编码格式(如H.264,H.265等)的数据,同亲利用同样的方法得到音频编码格式(如AAC)的数据
  2. 根据封装格式(如mp4,ts等)选择特定的封装器,获取输出文件格式添加视频、音频及对格式的头信息进行设置
  3. 最后利用封装器进行将已设置好的视频、音频、头信息等进行封装。最终得到个视频文件

解封装就是上面的逆过程,专业术语叫解复用,示意如下:请添加图片描述
解复用的过程如下:
1.初始化解复用器:对输入文件(容器,mpv,flv等)、输出文件(video,audio)进行处理
2.将输入的封装格式文件传输到解复用器内,打开文件,并分析格式上下文参数,获得流信息
3.利用解复用器对输入文件进行解封装,打开视频、音频编码器,针对视频数据分配图像(Image)和帧(Frame)结构,然后初始化数据包(AVPacket),从输入文件中读取AVFrame信息,并进行解码,最后释放各种分配的数据信息

提取音频流

//-vn 表示过滤掉视频流,ffmpeg默认将音频流存储为ADTS格式的aac文件
ffmpeg -i input.mp4 -vn -acodec copy output.aac

这里要注意,如果input.mp4中包含的音频流的编码格式不是AAC、H.264,则提取出来的音频文件就不能够存储为.aac,.h264的格式。

AAC是一种音频有损压缩技术,一种高压缩比的音频压缩算法,mp4
视频中音频数据大多采用这AAC压缩技术。AAC格式分为两种:一种是音频数据交换格式(Audio Data Interchange Format,ADIF),另一种是音频数据传输流(Audio Data Transport Stream,ADTS)。

ADIF常用须磁盘文件中,只有一个统一的头,所以必须得到所有数据后才能解码。

ADTS是一个有同步字的比特流,解码可以在这个流中的任意位置开始,它可以在任意帧解码,它的每个帧都头信息,目前编码后音频流一般采用ADTS。

提取视频流

//-an 表示过滤掉音频流,ffmpeg默认将音频流存储为ADTS格式的aac文件
ffmpeg -i input.mp4 -an -vcodec copy output.h264

H.264简介
H.264的目标是使用提取的文件有高视频压缩比和良好的网络亲和性,为了实现这两个目标,H.264的解决方案将系统架构分为两层:视频编码层、网络抽象层

关于H.264的重要概念
1.SoDB(String of Data Bit)数据比特串,这是由编码器直接输出的原始编码数据,称为VCL数据,
2.RBSP(Raw Byte Sequence Payload)原始字节序列载荷,这是在SoDB编码后的原始数据后面增加若干结尾比特(具体为1个为1的比特和若干为0的比特)使用SoDB的长度为整数字节。
3.EBSP(Extension Byte Sequence Payload)扩展字节序列载荷,这是RBSP的基础上增加了校验字节(0x03)
4.NALU(Nal Unit)NAL单元,由1个NAL Header和1个RBSP(或EBSP)组成。

H.264分为AVC1和H264 编码

H264即FOURCC H264(H264 bitstream with start codes)也被称为AnnexB格式,它是一种带有起始码的格式,它一般用于无线发射、有线广播或HD-DVD,这些数据流都有一个起始码0x000001或0x00000001. NALU是NAL网络适配层以网络所要求的恰当方式对数据进行打包和发送的基本单元,这种方式非常适合流式传输。NALU简单来说就是H.264格式中最基本的单元(数据包)。

AVC1,即FOURCC AVC1(H264 bitstream without start codes)是一种不带起始码的格式,主要存储在.mp4,.flv格式文件中,它的数据流的开始是1,2或4字节,表示长度数据。

FOURCC全称Four Character Codes,代表四字符代码,它是一个32位的标识,是一种独立标识视频数据流格式的四字符代码,视频播放软件通过查询FOURCC代码并且寻找与FOURCC代码相关联的视频解码器来播放特定的视频流。如:
DIV3 = DivX Low-Motion
DIV4 = DivX Fast-Motion
DIVX = DivX4
FFDS = FFDShow等。

常见的FOURCC代码:
1.I420: YUV编码,视频格式为.avi
2.PIM1: MPEG-1编码,视频格式为.avi
3.XVID:MPEG-4编码,视频格式为.avi
4.THEO: Ogg Vorbis,视频格式为.ogv
5.FLV1: Flash视频编码,视频格式为.flv
6.AVC1: H.264编码,视频格式为.mp4
7.DIV3: MPEG-4.3编码
8.DIVX: MPEG-4编码
9.MP42: MPEG-4.2编码
10.MJPG:motion-jpeg编码
11.U263: H.263编码
11.I263: H.263I编码

将视频流和音频流合成mp4文件

// -c copy 用于直接复制音视频流,不用重新编码
ffmpeg -i output.h264 -i output.aac -c copy -y hello.mp4

新生成的hello.mp4文件,封装格式为MP4,有视频流AVC和音频流AAC。

将多个mp4文件合成一个mp4文件
准备好多个mp4视频文件,它们的音视频参数需要一致,如帧率、码率等方面要一致,然后依次记录到一个txt文件中,如mp4list.txt,内容如下:
mp4list.txt:

file ‘1.mp4’
file ‘2.mp4’
file ‘3.mp4‘
// -c copy 用于直接复制音视频流,不用重新编码
ffmpeg -f concat -i mp4list.txt -c copy output.mp4

封装格式之间的转换

在前面我们已经描述得非常清楚了,封装格式就是音视频容器,将音频、视频、字幕等一起封装成一个视频文件。这个视频文件或用于存储或用于传输编码数据。封装格式的转换,不会影响画面质量,因为我们只是换一个容器也放编码好的音频、视频和字幕等内容,除非在换容器时,也使用新的编码。以下列出了一些常见的封装格式:

  • mpg:是mpeg编码采用的容器(封装格式),这个容器具有流的特性,它分PS和TS,PS用于DVD存储,TS用于HDTV。
  • vob:是dvd编码采用的容器,这个容器支持多视频、多音轨、多字幕等
  • mp4: mpeg编码采用的容器,这个容器是基于quick time mov开发的。
  • avi:这是音视频交互存储常见的容器,它支持非常多的音视频编码
  • mov:这个是quick time的容器,据说是至今最强大的容器,它支持虚拟现实技术等。mp4容器是mov的变体。

将mp4转换为flv

// -vcodec copy视频的编解码处理方式为直接复制
// -acodec copy音频的编解码处理方式为直接复制
// -f flv 强制指定封装格式
ffmpeg -i input.mp4 -vcodec copy -acodec copy -f flv output.flv

将mp4转换为avi

// -vcodec copy视频的编解码处理方式为直接复制
// -acodec copy音频的编解码处理方式为直接复制
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.avi

下面这个在转换封装格式的同时也会发生编码转换,因为如果没有像上面那样指定音视频编解码的处理方式,会使用相应容器的编码重新编码,如下面视频编码由H.264转换成MPEG4,音频编码由AAC转换成MP3.

ffmpeg -i input.mp4  output.avi

并不是容器(封装格式)都支持所有的编码,如:

// -c copy 用于直接复制音视频流,不用重新编码
// 这个转换会失败,因为avi里封装了aac,而mpg无法封装aac
ffmpeg -i input.avi -c copy output.mpg

上面这个转换可以下面这个来完成:

// 这个重新编码,所以不会有错
ffmpeg -i input.avi  output.mpg

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARM GIC (五)gicv3架构-LPI

在gicv3中,引入了一种新的中断类型。message based interrupts,消息中断。 一、消息中断 外设,不在通过专用中断线,向gic发送中断,而是写gic的寄存器,来发送中断。 这样的一个好处是,可以减少中断线的个数。 为了支持消息中断,gicv3,增加了LPI,来支持消息中断。并且…

分布式事务TCC补偿机制

文章目录 概述工作流程优缺点优点:缺点: 总结Java 示例代码 概述 TCC(Try-Confirm-Cancel)补偿机制是一种事务处理模式,用于确保分布式系统中的操作成功完成或在失败时进行补偿。TCC将一个事务拆分为三个阶段&#xf…

vue3老项目如何引入vite

vue3老项目如何引入vite 安装 npm install vite vitejs/plugin-vue --save-dev Vite官方中文文档修改package.json文件 在 npm scripts 中使用 vite 执行文件 "scripts": {"serve": "vite","build": "vite build","pr…

Vue 封装echarts柱状图(Bar)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 显示效果 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title" v-if"title">{{ title }}</div>…

python使用opencv提取视频中的每一帧、最后一帧,并存储成图片

提取视频每一帧存储图片 最近在搞视频检测问题&#xff0c;在用到将视频分帧保存为图片时&#xff0c;图片可以保存&#xff0c;但是会出现(-215:Assertion failed) !_img.empty() in function cv::imwrite问题而不能正常运行&#xff0c;在检查代码、检查路径等措施均无果后&…

探索应用程序的指路明灯:Route 和 Router 入门指南(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

GEE学习笔记

掩膜 ​ 在遥感图像处理中&#xff0c;"掩膜"是指一种用于隐藏或保留图像特定部分的技术。掩膜通常是一个二进制图像&#xff0c;其中的像素值为0或1&#xff0c;分别表示遮蔽或保留。 ​ 在去除云的情境中&#xff0c;掩膜通常用于隐藏图像中被云覆盖的部分&#…

【c++】入门1

c关键字 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff…

《工作、消费主义和新穷人》读书笔记

总结 全书前半段描写的是工作伦理论被推行的原因 &#xff0c;后半段探讨了福利国家和资本国家对于穷人的态度&#xff0c;最后描写了全球化下工作伦理从生产型社会过度到消费型社会的概念演变&#xff0c;和大众对于新穷人态度的转变。 启示 对于我的启示在前几章是最多的&…

SpringMVC:整合 SSM 中篇

文章目录 SpringMVC - 04整合 SSM 中篇一、优化二、总结三、说明注意&#xff1a; SpringMVC - 04 整合 SSM 中篇 一、优化 在 spring-dao.xml 中配置 dao 接口扫描&#xff0c;可以动态地实现 dao 接口注入到 Spring 容器中。 优化前&#xff1a;手动创建 SqlSessionTempl…

2022第十二届PostgreSQL中国技术大会-核心PPT资料下载

一、峰会简介 本次大会以“突破•进化•共赢 —— 安全可靠&#xff0c;共建与机遇”为主题&#xff0c;助力中国数据库基础软件可掌控、可研究、可发展、可生产&#xff0c;并推动数据库生态的繁荣与发展。大会为数据库从业者、数据库相关企业、数据库行业及整个IT产业带来崭…

软件测试5未来大发展路线,测试工程师发展偏向

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试的五大…

springCould中的consul-从小白开始【4】

目录 1.consul介绍 ❤️❤️❤️ 2.安装 ❤️❤️❤️ 3.创建8006模块 ❤️❤️❤️ 4.创建80模块❤️❤️❤️ 1.consul介绍 ❤️❤️❤️ Consul 是一种用于服务发现、配置和分布式一致性的开源软件。它由HashiCorp开发和维护&#xff0c;可用于帮助构建和管理现代化的分布…

ARM学习(24)Can的高阶认识和错误处理

笔者来聊一下CAN协议帧的认识和错误处理。 1、CAN协议帧认识 CAN 差分信号&#xff0c;是经过CAN收发器转成差分信号的&#xff0c;CAN RX和TX是逻辑电平。CAN的基础知识&#xff0c;可参考笔者这边文章&#xff1a;ARM学习&#xff08;21&#xff09;STM32 外设Can的认识与驱…

零基础快速上手HarmonyOS ArkTS开发2---ArkTS开发实践

ArkTS开发实践&#xff1a; 接着上一次零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍继续&#xff0c; 在上一次对于ArkTS的基础知识进行了学习&#xff0c;依照官方的课程计划&#xff0c;还有两个具体的小案例需要来实践实践&#xff1a; 实践出…

蓝桥杯 1223 第 2 场 小白入门赛

蓝桥小课堂-平方和 模拟 1 2 2 2 3 2 ⋯ n 2 n ⋅ ( n 1 ) ⋅ ( 2 n 1 ) 6 1^22^23^2\cdotsn^2\dfrac{n\;\cdot\;(n 1)\;\cdot\;(2n1)}{6} 122232⋯n26n⋅(n1)⋅(2n1)​。 write(n * (n 1) * (n * 2 1) / 6);房顶漏水啦 m a x ( 最大的行 − 最小的行 , 最大的列 −…

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试中&a…

CentOS 7 设置网络

CentOS 7 设置网络 正常情况 ①登陆进去之后使用下面的命令修改文件 echo ONBOOTyes >> /etc/sysconfig/network-scripts/ifcfg-ens33②如果是虚拟机重启后使用如下命令进行查看IP地址 ip addr注&#xff1a;到这里如果显示有两部分&#xff0c;则代表网络设置成功&a…

在同一局域网下连接共享文件夹失败,提示:你不能访问共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

1.尝试打开guest访问。 &#xff08;1&#xff09;使用键盘 win R 键&#xff0c;打开运行窗口&#xff0c;并输入 gpedit.msc 打开本地组策略编辑器窗口 &#xff08;2&#xff09;选择计算机配置------->管理模板-------->网络-------->Lanman工作站。 &#…

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

在信息化时代&#xff0c;移动应用已经成为企业发展的重要组成部分。然而&#xff0c;开发和维护原生客户端的成本却相对较高&#xff0c;需要大量的iOS、安卓和桌面端工程师。为了解决这一问题&#xff0c;WorkPlus作为一个功能完备的超级APP&#xff0c;为企业节约了大量的IT…