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

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

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

相关文章

关于设计模式、Java基础面试题

前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法? 细分起来就有9种:懒汉&#x…

lv13 内核模块动态添加新功能 6

1 动态加载法 即新功能源码与内核其它源码不一起编译,而是独立编译成内核的插件(被称为内核模块)文件.ko 1.1 新功能源码与Linux内核源码在同一目录结构下时 给新功能代码配置Kconfig(模块代码与上一级相同) 给新功能代码改写…

八种常见顺序存储的算法

目录 1、线性枚举 1)问题描述 2)动图演示 3)示例说明 4)算法描述 5)源码详解 2、前缀和差分 1)问题描述 2)动图演示 3)样例分析 4)算法描述 5)源码…

Flink Kafka[输入/输出] Connector

本章重点介绍生产环境中最常用到的Flink kafka connector。使用Flink的同学,一定会很熟悉kafka,它是一个分布式的、分区的、多副本的、 支持高吞吐的、发布订阅消息系统。生产环境环境中也经常会跟kafka进行一些数据的交换,比如利用kafka con…

类。。。。

定义一个person类&#xff0c;包含私有成员&#xff0c;int *age,string &name,一个stu类&#xff0c;包含私有成员double *sore,person p1,写出person类和stu类的特殊成员函数&#xff0c;并写一个stu的函数&#xff0c;显示所有信息。 #include <iostream>using n…

Android下载gradle失败解决方法

1、在gradle-wrapper.properties文件中查看自己需要下载gradle什么版本的包和zip路径&#xff08;wrapper/dists&#xff09;。 2、在setting中查看Gradle的保存路径&#xff0c;如下图&#xff1a;C:/Users/Administrator/.gradle&#xff0c;加上第一步的zip路径得到下载grad…

15 Sequence-Driver-Sequencer communication in UVM

我们分别讨论了sequece_item、sequence、sequencer和driver。在本节中&#xff0c;我们将讨论他们如何相互talk&#xff0c;sequencer如何给driver提供从sequence里的sequence item。在开始阅读本节之前&#xff0c;请确保您了解sequencer和driver中使用的所有方法。&#xff0…

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动&#xff08;建议&#xff09; sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…

普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)

简介 使用TIM2实现1us延时其他知识 公式 时间&#xff08;s&#xff09;1/时钟频率&#xff08;Hz&#xff09;由导出 1us 1/1M(Hz)预分配设置 系统时钟是72MHz, 要1us的延时, 预分配得设置为72-1计数器重载设置 设置为最大值65535&#xff0c;这样延时的时间可以设置的最…

【Vue3】创建项目的方式

1. 基于 vue-cli 创建 ## 查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上 vue --version## 安装或者升级你的vue/cli npm install -g vue/cli## 执行创建命令 vue create vue_test本质上使用webpack&#xff0c;默认安装以下依赖&#xff1a; 2. 基于 vite 创建 官…

Buck电源设计常见的一些问题(五)MOS管振荡抑制方法(三)

MOS管振荡抑制方法(三)Rboot的选取 1.Rboot的选取2.总结1.Rboot的选取 同步 Buck 变换器一般采用自举电路供电,如图所示。开关节点上升沿的振荡与上管开通关系密切,上管开通时的驱动电流路径如图所示。因此,可以通过增大 Rboot来减缓上管开通的速度,从而抑制开关节点的振…

文献速递:人工智能医学影像分割---高效的MR引导CT网络训练,用于CT图像中前列腺分割

01 文献速递介绍 如今&#xff0c;根据国家癌症研究所的报告&#xff0c;美国约有9.9%的男性患有前列腺癌。1 此外&#xff0c;根据美国癌症协会的数据&#xff0c;预计2019年将有174,650个新病例被诊断出前列腺癌&#xff0c;与此同时大约有31,620名男性将死于前列腺癌。因此…

vue前端预览pdf并加水印、ofd文件,控制打印、下载、另存,vue-pdf的使用方法以及在开发中所踩过的坑合集

根据公司的实际项目需求&#xff0c;要求实现对pdf和ofd文件的预览&#xff0c;并且需要限制用户是否可以下载、打印、另存pdf、ofd文件&#xff0c;如果该用户可以打印、下载需要控制每个用户的下载次数以及可打印的次数。正常的预览pdf很简单&#xff0c;直接调用浏览器的预览…

计算机操作系统(OS)——P1操作系统概述

1、操作系统的概念(定义) 1.1、什么是操作系统 __操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;__是指控制和管理整个计算机系统的__硬件和软件__资源&#xff0c;并合理的组织调度计算机的工作和资源的分配&#xff1b;以__提供给用户和其它…

pytest实现多进程与多线程运行超好用的插件

前言 如果想分布式执行用例&#xff0c;用例设计必须遵循以下原则&#xff1a; 1、用例之间都是独立的&#xff0c; 2、用例a不要去依赖用例b 3、用例执行没先后顺序&#xff0c; 4、随机都能执行每个用例都能独立运行成功每个用例都能重复运行&#xff0c;不影响其它用例 这…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

JavaScript练习题第(四)部分

大家好关于JavaScript基础知识点已经发布&#xff1a;需要的大家可以去我的主要查看 &#xff08;当然了有任何不会的&#xff0c;可以私信我&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 为了巩固大家学习知识点给大家准备几道练习题&#xff1a; 当然&…

网络编程『简易TCP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文TCP网络程序1.字符串回响1.1.核心功能1.2.程序…

CGAL的D维包围盒相交计算

包围盒相交测试是一种用于快速判断两个三维对象是否相交的方法&#xff0c;而AABB树则是一种数据结构&#xff0c;常用于加速场景中的射线检测和碰撞检测。 首先&#xff0c;让我们了解一下包围盒相交测试。这种测试的目的是为了快速判断两个三维对象是否相交&#xff0c;而不需…