【FFmpeg实战】视频容器

news2024/11/18 20:27:30

原文地址:https://alphahinex.github.io/2020/03/12/video-container/

视频容器

我们常见的视频格式有 avi 或 mp4 等,这些所谓的视频格式,实际上指的只是视频容器的格式。就像 zip 格式的压缩包里面可以放置任意类型的文件一样,视频容器格式可以简单理解为只定义了如何将视频及音频流数据存储在容器文件中。实际情况会比这更复杂一些,因为不是所有的视频流都可以兼容存入任意视频容器中。

一个视频文件通常包含多个轨道(track)—— 一个视频轨道(不包含声音),叠加一个或多个音频轨道(没有图像)。轨道之间通常是相互关联的。一个音频轨道中会包含一些标记,用来同步声音和图像。每个轨道可以有自己的元数据信息,如视频轨道的画面比例或音频轨道的语言。视频容器同样可以有元数据,如视频的标题、封面等等。

视频容器的格式有很多,常见的包括:

  • MPEG 4,通常是扩展名为 .mp4 或 .m4v 的文件。MPEG 4 容器是基于苹果之前的 QuickTime 容器格式(.mov)而来的。
  • Ogg,扩展名通常为 .ogg 或 .ogv。 Ogg 是一个开放的标准,开源友好,不受任何已知的专利限制。Firefox 3.5+,Chrome 4+ 以及 Opera 10.5+ 无需插件原生支持。Ogg 容器格式,包含 Ogg 视频(名为 Theora)和 Ogg 音频(名为 Vorbis)。Ogg 格式是大多数 Linux 发行版的开箱即用视频格式,并可以通过著名的 VLC 播放器在各个平台上进行播放。
  • WebM,扩展名 .webm。WebM 是一种无版税,开源友好的,专为 HTML5 设计的视频压缩格式,使用 VP8 视频编码和 Vorbis 音频编码。在技术上类似 Matroska 格式(.mkv)。同样无需插件,在当前版本的 Chromium,Chrome,Firefox 和 Opera 上原生支持。
  • Flash Video (.flv) 是 Adobe Flash Player 所使用的格式。在近期的 Flash Player 版本中也加入了对 MPEG 4 容器的支持。
  • ASF (.asf) 和 Audio Video Interleave (.avi) 是微软发明的格式,早期使用较多。

视频编解码器

当我们观看视频时,视频播放器至少同时做了三件事:

  1. 解析视频容器格式,找到可用的视频及音频轨道,以及他们是如何存放在容器内的,以便获得解码所需数据
  2. 解码视频流,在屏幕上显示一系列的图像
  3. 解码音频流,在扬声器中播放声音

编解码器是指对视频进行编码和解码的算法。视频按照编码算法被转换成二进制流文件进行存储和分发,视频播放器按照解码算法对视频流进行解码,并将一系列图像或帧显示在屏幕上。大多数现代视频编解码器都竭尽其能地减少播放下一帧所需的信息。例如,为了避免保存每一帧图像(类似截屏),编码时将只会存储每帧之间的差异内容。多数视频也不是每一帧都与上一帧完全不同,这便使得更高的压缩率和更小的文件尺寸成为可能。

编解码器分为有损和无损两种类型。无损类型的视频尺寸对于互联网来说还是太大了,所以我们这里只关注有损类型的视频编码。有损类型的视频编解码器,意味着对视频编码总会伴随着不可挽回的原始数据丢失。就像翻录卡带一样,每次视频编码都会造成源视频信息的丢失以及视频质量的下降。多次编码后视频可能会有明显的卡顿,尤其是动作很多的视频(如动作片)。然而好的方面是,有损的视频编码格式能够提供惊人的压缩比例,并通过一些播放时的优化技术,使肉眼很难察觉到这些信息的损失。

常见的视频编解码器有 H.264、Theora 和 VP8。

H.264

H.264,即 MEPG-4 part 10、MPEG-4 AVC、MPEG-4 Advanced Video Coding。 H.264 是 MPEG 组织 开发并于 2003 年标准化的编码格式。它致力于为低带宽、低性能 CPU 设备(如手机),高带宽和高性能 CPU 设备(如现代桌面电脑),以及所有在此范围之间的设备,提供单独的一种编解码器。为了实现这个目标, H.264 标准定义了多种 profiles 和 levels。配置(profile)定义了编码时所采取的约束,使解码器了解解码视频的要求;等级(level)与配置共同指定了视频的最大解析度、帧速及码率等。更高的配置提供更好的视频质量,更长的编码时间以及在实时播放时需要更强劲的 CPU 来解码。

概括来说,iPhone 可支持 High 配置,AppleTV 支持 Baseline、Main 和 High 配置,Flash 和台式机支持 Baseline、Main 和 High 配置。H.264 同时也是蓝光标准授权的编解码器,蓝光光盘通常使用 High 配置。

大多数的非 PC 设备(如 iPhone 和蓝光播放器)在播放 H.264 视频时,实际是由专用芯片负责解码,因为他们的 CPU 并没有足够的性能以支持视频的实时播放。目前甚至一些低端的桌面显卡也能够支持硬件解码 H.264。有很多 H.264 的编码器,包括开源的 x264 library。H.264 视频可以嵌入到大多数流行视频容器格式中,包括 MP4 和 MKV。

H.264 标准是需要支付专利许可费用的,专利许可的主要来源是 MPEG LA 组织。2010年8月26日,MPEG LA 组织宣布使用 H.264 编码的网络视频对最终用户永久免费。但是离开网络使用到有关 H.264 的产品或服务,还是需要支付费用的。

img

“MPEG-4/H.264 video format”

数据来源

Theora

Theora 由 VP3 编解码器 演化而来,随后由 Xiph.org 基金会 开发维护。Theora 开源且免费,不过这套标准于 2004 年即处于“冻结”状态,Theora 项目(包含开源的视频编码及解码)只在 2008 年发布了初版,2009 年发布了 1.1.1 稳定版,最近一次发布的 1.2.0 Alpha 1 预览版也已是 5 年前的事情了。

Theora 视频可以嵌入到任何视频容器格式内,不过最常见的还是 Ogg 容器。所有主流的 Linux 发行版都默认支持 Theora 格式,Firefox、Chrome 和 Opera 的当前版本都对其提供了原生支持。在安装了 Xiph.org 提供的开源解码软件后,在 Windows 和 Max OS X 也可以播放 Theora 视频。

img

“Ogg/Theora video format”

数据来源

VP8

VP8 最早由 On2 开发,2010 年,Google 收购 On2 后发布了这个视频编解码器的规范和开源的编码解码示例。在经过一些争论之后,最终 VP8 的授权确认为一个开放源代码授权

WebM 项目和 VP8 同时在 2010 年 5 月发表,Mozilla、Opera、Google 和其他 40 多家厂商共同协助发展,目的是让 VP8 成为 HTML5 的视频格式。 WebM 为一个容器格式,视频部分使用 VP8,声音格式则是使用 Vorbis。

img

“WebM video format”

数据来源

音频编解码器

同视频编解码器一样,音频编解码器是指对音频流编码和解码的算法。音频编解码器也分为有损和无损两种。无损的音频对互联网来说同样太大,所以我们只关注有损音频编解码。

在播放视频时,音频编解码器起到的作用是解码音频数据流,并将其通过扬声器播放出来。同有损编码视频一样,有很多办法来减小音频流的尺寸。在 录音 - 编码 - 解码 - 播放 的过程中,有大量信息被丢弃。不同的音频编解码器丢弃的内容不同,但他们都能做到欺骗你的耳朵,让你察觉不到这些损失。

有一个只有在音频中才存在的概念:声道。声音通过扬声器来播放,普通的桌面电脑可能拥有左右两个扬声器。环绕立体声系统拥有 6 个甚至更多的扬声器。一个扬声器可以用来播放原始音轨中的一个特定声道。当你坐在 6 个扬声器之中,被 6 个独立声道播放出的声音所环绕,你的大脑会同步它们并使你产生出一种身临其境的感觉。

大部分通用性的音频编解码器能够处理两个声道。在录音时,声音被切分成左右两个声道;在编码时,两个声道被存储在同一个音频流中;解码时,两个声道解译后被送至不同的扬声器来播放。一些音频解码器能够处理两个以上的声道,并且加以区分,以便在播放时能够通过恰当的扬声器来播放。

常用的音频编解码器有:MP3、AAC 和 Vorbis。

MPEG-1 Audio Layer 3

MPEG-1 Audio Layer 3 即 MP3。MP3 最多能容纳两个声道,可以编码为不同比特率:64 kbps, 128 kbps, 192 kbps, 甚至从 32 到 320 的各种速率。更高的比特率意味着更大的文件尺寸和更好的音频质量,不过音频质量和比特速率不是正比关系。128 kbps 要比 64 kbps 的音质水平提升两倍以上,但 256 kbps 并不能达到 128 kbps 的两倍音质。MP3 支持可变比特率编码,这意味着一个音频流的某一部分可能会比另一部分的压缩率高。例如交响乐在演奏时使用高比特率,而在章节间的静默阶段使用低比特率。MP3 同样也支持固定比特率编码

MP3 标准没有确切定义如何编码,但却明确定义了如何解码;不同的编码器使用不同方式导致编码结果大相径庭,但它们需要保证编码结果都可以使用同一个播放器来解码并播放。开源的 LAME 项目 是免费编码器的首选。

MP3 格式(于 1991 年标准化)是受版权约束的,这也解释了为什么 Linux 系统不能直接播放 MP3 文件。官方是要求 MP3 编解码器购买授权的,但 MP3 的版权非常混乱和碎片化,这也导致 MP3 成为事实上的免费格式。到 2015 ~ 2017 年, MP3 的专利也基本都到期了,也将成为公共领域的东西。所有随身听都可以播放 MP3 文件,MP3 音频流也可以嵌入至任意视频容器中。Adobe Flash 可以播放独立的 MP3 文件,也可以播放在 MP4 视频容器中的 MP3 音频流。

img

“MP3 audio format”

[数据来源](http://caniuse.com/#search=mp3 audio)

Advanced Audio Coding

Advanced Audio Coding 通常简称为 AAC。标准化于 1997 年的这个规范,因苹果选择其作为 iTunes Store 的默认格式而声名鹊起。AAC 格式是需要收取版权费用的,收费标准可在 这里 查看。终端用户编码器和/或译码器产品制造商或开放商需要获得 AAC 专利授权。以 AAC 格式编码发布的比特流 —— 无论是通过广播、网络数据流或是通过物理媒体提供 —— 都没有专利授权费

AAC 被设计为在使用与 MP3 相同的比特率时提供更好的音质,并且可以使用任意比特率来编码(MP3 被限定在最高 320 kbps)。AAC 编码的音频最多可支持 48 个声道,虽然实际中并没有人需要使用这么多声道。AAC 格式还有一个区别于 MP3 的地方时,它同 H.264 一样,定义了多种配置(profile)。低端配置用以在计算资源有限的设备上实时播放,高端配置提供更好的音质,同时需要更长的编解码时间。

当前所有的苹果产品,包括 iPod、AppleTV 和 QuickTime 都支持播放在 MP4 视频容器中的 ACC 格式的固定配置音频流。Adobe Flash 通开源的 MPlayer 和 VLC 播放器一样,支持 MP4 容器中的任意配置的 AAC 格式音频。编码方面,FAAC 类库是一个可选的开源类库,同时还有 mencoder 和 ffmpeg。

img

“AAC audio file format”

[数据来源](http://caniuse.com/#search=AAC audio)

Vorbis

Vorbis 通常被称作 Ogg Vorbis,不过从技术角度来说这个称呼是有误的。Ogg 只是一个视频容器格式,Voribs 音频流也可以被嵌入到其他视频容器中。Vorbis 是开放、免费且无专利限制的,因此所有主要的 Linux 发行版及移动设备都可以通过开源的 Rockbox 固件为其提供支持。Vorbis 格式音频流通常被嵌入在 Ogg 或 WebM 容器中,但它们同时也可以被嵌入在 MP4 或 MKV 容器里(甚至经过一些改动后,也可以嵌入在 AVI 中)。Vorbis 支持任意数量的声道

开源的 Vorbis 编码器和解码器有很多,包括 OggConvert(编码)、ffmpeg(解码)、aoTuV(编码)和 libvorbis(解码)。

img

“Ogg Vorbis audio format”

数据来源

>>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864 
>>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群: 739729163  领取

img

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

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

相关文章

【初识 Docker | 中级篇】 Docker 中部署 Spring Boot 微服务详解

文章目录 前言一、生成 Docker 镜像1.编写Dockerfile2.构建镜像 二、启动容器1.运行服务2.测试 三、jar包映射部署1.更新Dockerfile文件2.构建镜像3.创建&启动容器 总结 前言 本文将为您详细介绍如何在Docker容器中部署Spring Boot服务。 首先,您需要为您的Sp…

Argo CD 实践教程 07

在本章中,我们将探讨如何设置用户访问Argo CD的权限,以及从终端或CI/CD管道连接CLI的选项,以及如何执行基于角色的访问控制。我们将查看单点登录(SSO)选项,通常这是一个需要付费的功能,但由于Ar…

Bean与@Bean注解

文章目录 一、背景与IoC二、注解Bean1、Bean注解用法2、Bean注解源码3、Bean注解演示 一、背景与IoC 之前的代码书写现状—耦合度偏高。如下图,业务层需要数据层实现类对象BookDaoImpl,于是自己new了一个,此时,当数据层类名改为B…

隐藏菜单之菜单和搜索

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>菜单</title><style>/* css代码开始*/* {margin: 0;padding: 0;box-sizing: border-box;}b…

人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型,并实现模型的训练与预测

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型15-手把手搭建MnasNet模型&#xff0c;并实现模型的训练与预测&#xff0c;本文将介绍MnasNet模型的原理&#xff0c;并使用PyTorch框架构建一个MnasNet模型用于图像分类任务&#xff0c;…

1、电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库&#xff08; Data Warehouse &#xff09;&#xff0c;是为企业制定决策&#xff0c;提供数据支持的。可以帮助企业&#xff0c;改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括&#xff1a;业务数据、用户行为数据和爬虫数据等。 业务数…

Linux——使用第三方库链接的方式——动态式

回顾上文&#xff1a; (122条消息) Linux使用第三方库链接的使用方式——静态式_橙予清的zzz~的博客-CSDN博客https://blog.csdn.net/weixin_69283129/article/details/131414804?spm1001.2014.3001.5502 上篇文章中&#xff0c;我讲到了关于链接第三方库作为静态库的使…

股票技术分析方法综述

文章目录 K线均线MACDKDJ和RSIBOLL线趋势理论、支撑位和压力位形态理论量价关系理论道氏理论波浪理论江恩理论缠论自定义指标 K线 K线的组合形态是K线技术分析中的重要部分&#xff0c;包括早晨之星、黄昏之星、红三兵、黑三兵等。 早晨之星&#xff1a;由三根K线组成&#x…

OpenGL 抗锯齿

1.简介 你可以看到&#xff0c;我们只是绘制了一个简单的立方体&#xff0c;你就能注意到它存在锯齿边缘。 可能不是非常明显&#xff0c;但如果你离近仔细观察立方体的边缘&#xff0c;你就应该能够看到锯齿状的图案。如果放大的话&#xff0c;你会看到下面的图案&#xff1a…

家校互动、班级管理系统

最近做了一款使用若依开源框架搭建的一款家校互动、班级管理的平台&#xff0c;采用uniapp作为APP端&#xff0c;原生小程序作为小程序的家长端。

软件测试的概念与过程(软件测试的历史、概念、结构、过程)

软件测试的概念与过程----软件测试的历史 软件测试的历史软件的概念软件的结构软件测试的过程 软件测试的历史 1、早期的的软件开发过程中&#xff0c;将测试“调试”&#xff0c;目的是纠正软件已经知道的故障&#xff0c;常常有开发人员自己去完成这部分工作。 2、1957年&…

使用数据集工具

一.数据集工具介绍 HuggingFace通过API提供了统一的数据集处理工具&#xff0c;它提供的数据集如下所示&#xff1a; 该界面左侧可以根据不同的任务类型、类库、语言、License等来筛选数据集&#xff0c;右侧为具体的数据集列表&#xff0c;其中有经典的glue、super_glue数据集…

Unity | HDRP高清渲染管线学习笔记:材质系统Lit着色器

目录 一、Lit着色器 1. Surface Options 2. Surface Inputs&#xff08;表面输入&#xff09; 3. Transparency Inputs 二、HDRP渲染优先级 我们可以把现实世界中的物体分成不透明物体和透明物体&#xff08;其中包括透明或者半透明&#xff09;。在实时渲染时&#xff0c…

Debian二次开发网关支持Docker+RS485+网口

随着物联网技术的不断发展&#xff0c;瑞芯微边缘计算网关作为一种集成多种接口和功能的智能网关&#xff0c;逐渐成为了物联网领域中的热门产品。本文将详细介绍瑞芯微边缘计算网关的特点和优势&#xff0c;并探讨其在实际应用中的广泛应用。 瑞芯微Linux系统边缘计算网关是一…

【Java】 Java 私有接口方法的使用

本文仅供学习参考&#xff01; 相关教程地址&#xff1a; https://www.baeldung.com/java-interface-private-methods https://www.geeksforgeeks.org/private-methods-java-9-interfaces/ https://www.runoob.com/java/java9-private-interface-methods.html 接口是定义一组方…

java之路—— SpringMVC的常用注解解析以及作用、应用

创作不易&#xff0c;真的希望能给个免费的小 文章目录 1、Controller2、RequestMapping3.GetMapping、PostMapping、PutMapping、DeleteMapping4. RequestParam5.PathVariable6.RequestHeader7.CookieValue8.RequestBody9.ResponseBody10.SessionAttribute11.ControllerAdvice…

二层、三层交换机是什么?有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解二层交换机和三层交换机是什么&#xff0c;以及他们的区别。 目录 一、二层交换机是什么&#xff1f; 二、二层交换机的主…

本地生活多城市合伙人系统开发

本地生活多城市合伙人项目是一种基于本地生活服务的创业项目&#xff0c;旨在为各个城市的居民提供方便、实惠、高品质的生活服务。该项目通过招募多个城市的合伙人&#xff0c;建立完整的本地生活服务平台和供应链体系&#xff0c;覆盖不同类型的本地生活服务&#xff0c;如餐…

Nginx的Rewrite(地址重定向)

目录 前言 一、Rewrite 跳转场景 二、Rewrite 跳转实现 三、Rewrite实际场景 3.1Nginx跳转需求的实现方式 3.2rewrite放在 server{}&#xff0c;if{}&#xff0c;location{}段中 3.3对域名或参数字符串 四、Rewrite正则表达式 五、Rewrite语法格式 5.1rewrite语法格式…

互联网常见架构接口压测性能分析及调优手段建议

目录 互联网常见架构接口压测性能分析及调优手段建议 1 接口名称: 获取列表 1.1 压测现象:单台tps700多&#xff0c;应用cpu高负载 1.1.1 问题分析: 1.1.2 改进措施: 1.1.3 改进效果: 1.2 压测现象&#xff1a;数据库资源利用率高 1.2.1 问题分析: 1.2.2 改进措施: 1.2.3 改…