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

news2024/12/26 20:55:31

音视频的编码格式与封装格式是两个不同的概念,视频封装格式常见的有: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

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

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

相关文章

中伟视界:天然气站安全隐患AI解决方案, 人工智能, 安全风险评估, 预测维护, 智能管理

近年来,随着人工智能技术的不断发展,越来越多的行业开始将人工智能应用于生产和管理中。在天然气行业,利用人工智能AI算法排除安全隐患已经成为一种新的趋势。那么,天然气站如何利用人工智能AI算法排除安全隐患呢?接下…

15、Qt显示图片并支持缩放、移动等操作

一、新建项目 点击“New Project”,选择“Application”“Qt Widget Application”,点击“Choose” 更改项目名称和位置 选择编译器 默认 默认 二、创建自定义类 右击项目名,选择“Add New” 选择“C” -> "C Class"&#xff…

数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)

文章目录 二叉排序树总览二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除删除的是叶子节点删除的是只有左子树或者只有右子树的节点删除的是有左子树和右子树的节点 查找效率分析查找成功查找失败 小结 二叉排序树 总览 二叉排序树的定义 …

7-1 建立二叉搜索树并查找父结点(PTA - 数据结构)

按输入顺序建立二叉搜索树,并搜索某一结点,输出其父结点。 输入格式: 输入有三行: 第一行是n值,表示有n个结点; 第二行有n个整数,分别代表n个结点的数据值; 第三行是x,表示要搜索值…

华清远见作业第十四天

思维导图 1、顺序表按元素删除 代码: int delete_num_delete(sqlist *list,datatype key) {int indexseek_num(list,key);//元素查找函数if(index-1){return -1;}delete_index(list,index);return 0; } 2、顺序表按照元素修改 代码: //顺序表按照元…

人流量监测识别摄像机

人流量监测识别摄像机是一种基于人工智能技术的智能监控设备,其主要功能是通过摄像头捕捉实时画面,利用深度学习算法对画面中的人数进行实时识别和统计。这种摄像机可以广泛应用于各种场合,如商场、车站、学校、医院等公共场所,以…

Transformer引领AI领域:从模型到平台,全方位探索与实践

编辑推荐 在不到4 年的时间里,Transformer 模型以其强大的性能和创新的思想,迅速在NLP 社区崭露头角,打破了过去30 年的记录。BERT、T5 和GPT 等模型现在已成为计算机视觉、语音识别、翻译、蛋白质测序、编码等各个领域中新应用的基础构件。…

es、MySQL 深度分页问题

文章目录 es 深度分页MySQL 深度分页 es 深度分页 es 深度分页问题,有点忘记了,这里记录一下 当索引库中有10w条数据,比如是商品数据;用户就是要查在1w到后10条数据,怎么查询。 es查询是从各个分片中取出前1w到后10条数…

redis 从0到1完整学习 (五):集合 IntSet 数据结构

文章目录 1. 引言2. redis 源码下载3. IntSet 数据结构4. 参考 1. 引言 前情提要: 《redis 从0到1完整学习 (一):安装&初识 redis》 《redis 从0到1完整学习 (二):redis 常用命令》 《redi…

JavaOOP篇----第十篇

系列文章目录 文章目录 系列文章目录前言一、构造方法能不能显式调用?二、什么是方法重载?三、构造方法能不能重写?能不能重载?四、内部类与静态内部类的区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

Springboot启动异常 OgnlException: sqlSelect [java.lang.NoSuchMethodError

完整的日志如下: Invocation of init method failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ew ! null and ew.sqlSelect ! null. Cause…

协作机器人(Collaborative-Robot)安全碰撞的速度与接触力

协作机器人(Collaborative-Robot)的安全碰撞速度和接触力是一个非常重要的安全指标。在设计和使用协作机器人时,必须确保其与人类或其他物体的碰撞不会对人员造成伤害。 对于协作机器人的安全碰撞速度,一般会设定一个上限值&…

Excel排序怎么做?记好这些正确操作!

“我是个职场新手,对excel的使用还不是很熟悉。但是我需要处理一份文件。有朋友可以简单介绍一下excel排序的操作方法吗?” Excel作为一个实用的办公工具,给用户带来了很多的方便。在使用excel时,排序功能是比较重要且常用的。我们…

轴承故障诊断分类模型全家桶-最全教程

Python轴承故障诊断 (一)短时傅里叶变换STFT-CSDN博客 Python轴承故障诊断 (二)连续小波变换CWT-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD-CSDN博客 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Trans…

打造明厨亮灶工程,需要哪些AI视频智能算法助力?

旭帆科技AI智能监控可以通过摄像头、传感器和数据处理等技术手段,实时监测厨房人员着装、行为与烟火等,对厨房实时监控进行分析与记录,从而实现明厨亮灶场景的搭建,保障食品安全和服务质量。 1、烟火识别 对于后厨来说&#xff0…

搭建动态网站之——基于Redhat8.6搭建Discuz论坛

目录 一、动态网站与静态网站区别 1、提供用户互动接口的动态网站 2、搭建动态网站的需求: 二、搭建步骤 第一步:www服务器配置 第二步;编辑网页文件 第三步:使用xftp 将Discuz包传到/discuz解压 1、将Discuz包移动到/discuz 2、解压…

双燃料发动机,预计2025年市场规模将达到39亿美元

双燃料发动机是一种可以使用两种不同类型的燃料(通常是天然气和柴油)运行的发动机,具有更大的灵活性和更低的排放。近年来,在对更清洁、更高效能源的需求不断增长的推动下,双燃料发动机市场增长迅速。 全球市场&#x…

End-to-End Object Detection with Transformers(2020)

文章目录 AbstractIntroductionThe DETR modelObject detection set prediction loss二元匹配匈牙利损失如下Bounding box loss DETR architecture Conclusion hh 源代码 Abstract 我们提出了一种将目标检测视为直接集预测问题的新方法。我们的方法简化了检测管道,…

VUE中的index.html、App.vue和main.js的关系

VUE中的index.html、App.vue和main.js的关系,个人理解。 javascriptCopy code import Vue from vue; import App from ./App.vue;new Vue({render: h > h(App), }).$mount(#app);

【工具与中间件】通过飞书应用操作云文档

文章目录 前言1. 准备工作1.1 创建应用1.2 创建文件夹 2. 测试租户/个人版实践2.1 权限配置2.2 控制台调试2.3 协作文档添加应用2.4 CRUD2.4.1 根据文档描述选择token并生成2.4.2 新增多维表格数据API2.4.3 删除多维表格数据API2.4.4 查询多维表格数据API2.4.5 修改多维表格数据…