最近一直在看雷霄骅 FFmpeg 系列视频,然后将自己的理解总结一下。

参看:《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频

一、视频播放器原理

自己理解:

比如一个 MP4 文件,它是有音频、有视频两部分封装的。PCM 音频采样数据和 YUV 视频像素数据,通过音视频编码 Encode,生成AAC和H.264文件,最后封装成 MP4 文件。

然后,我想起我使用 PR 剪辑视频时,其实就是这个过程,将音视频合成MP4文件的。

二、常用播放器

     

VLC、CyberLink PowerDVD 14、完美风暴

下载:VLC media player 下载

下载:powerDVD 14 破解 安装 方法 下载 地址 免费

下载:完美解码V20170702官方版

三、信息查看工具

(1)综合信息查看:MediaInfo


可选择以什么形式查看,比如我们以文本形式查看:


任意4个文件的总体信息

(2)二进制信息查看

下载:UltraEdit

(3)单项详细分析

封装格式: Elecard Format Analyzer


MKV、 MP4、 AVI封装格式信息



视频编码数据: Elecard Stream Eye


H.264码流分析信息

               红色的帧: I帧;蓝色的帧: P帧;绿色的帧: B帧。

视频像素数据: YUV Player


YUV视频像素数据
 

音频采样数据: Adobe Audition


PCM音频采样数据 

四、封装格式

(1)封装格式的作用

视频码流和音频码流按照一定的格式存储在一个文件中。

(2)格式类型



五、视频编码数据

(1)视频编码的作用

将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。

(2)视频编码类型

六、音频编码数据

(1)音频编码的作用

将音频采样数据(PCM 等)压缩成为音频码流,从而降低音频的数据量。

(2)音频编码类型

七、视频像素数据

(1)视频像素数据作用

保存了屏幕上每个像素点的像素值。

(2)格式

常见的像素数据格式有 RGB24,RGB32,YUV420P,YUV422P,YUV444P 等。压缩编码中一般使用的是 YUV 格式的像素数据,最为常见的格式为 YUV420P。

(3)特点

视频像素数据体积很大,一般情况下 1 小时高清视频的 RGB24 格式的数据体积为:

        3600*25*1920*1080*3=559.9GByte
PS:这里假定帧率为25Hz,取样精度8bit。

(4)RGB 格式简介

Red、 Green、 Blue三种颜色,可以混合成世界上所有的颜色。
彩色图像中每个点,由R、 G、 B三个分量组成。
以 RGB24 为例,图像像素数据的存储方式如下:

       

从图中可以看出, RGB24依次存储了每个像素点的R、 G、 B信息。
PS: BMP文件中存储的就是RGB格式的像素数据。

(5)YUV格式简介

相关实验表明,人眼对亮度敏感而对色度不敏感。因而可以将亮度信息和色度信息分离,并对色度信息采用更“狠”一点的压缩方案,从而提高压缩效率。
YUV 格式中, Y 只包含亮度信息,而 UV 只包含色度信息。以 YUV420P 为例,图像像素数据的存储方式如图所示。从图中可以看出, YUV420P 首先存储了整张图像的Y信息,然后存储整张图像的 U 信息,最后存储了整张图像的 V 信息。

8、音频采样数据

(1)音频采样数据作用

保存了音频中每个采样点的值。

(2)特点

音频采样数据体积很大,一般情况下一首4分钟的PCM格式的
歌曲体积为:
        4*60*44100*2*2=42.3MByte
PS:这里假定采样率为44100Hz,采样精度为16bit。

(3)PCM格式简介

单声道的情况下按照顺序存储每个采样点的数据。

双声道的情况下按照“左右、左右”的顺序存储每个采样点两个声道的数据。

FFmpeg再学习 -- 视音频基础知识的更多相关文章

  1. FFmpeg再学习 -- FFmpeg解码知识

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作 前面用了五个篇幅来讲 FFmpeg,其主要目的是为实现将图片转视频的功能. 总的来说,对于 FFmepg 多少有一些了解了.但 ...

  2. FFmpeg再学习 -- SDL 环境搭建和视频显示

    继续看雷霄骅的 课程资料 - 基于FFmpeg+SDL的视频播放器的制作 一.SDL 简介 参看:WIKI -- Simple DirectMedia Layer 参看:最简单的视音频播放示例9:SD ...

  3. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  4. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

  5. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  6. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  7. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  8. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  9. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

随机推荐

  1. python全栈开发从入门到放弃之文件处理

    一.文件处理流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 事例文件内容 [一棵开花的树] 如何让你遇见我 在我最美丽的时刻 为这 我已在佛前求了五百年 求 ...

  2. Python函数之初体验

    定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们先定义一个求字符串长度的函数 ...

  3. dymaic方式的Json序列化

    from:http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object If you ...

  4. Word 中设置图、表、公式、代码要与正文之间行间距

    一.概述 在撰写论文等文档时,常常对图.表.公式.代码要与正文之间行间距有要求.例如: (5)图.表.公式.代码要与正文之间有6磅的行间距. 二.设置方式 选中 图/表/公式/代码 与 图题/表头/- ...

  5. 理解盒模型——外边距、内边距和边框之间的关系,IE 8以下版本的浏览器中的盒模型有什么不同。

    一个元素盒模型的层次从内到外分别为:内边距.边框和外边距IE8以下浏览器的盒模型中定义的元素的宽高不包括内边距和边框

  6. mysql 系列文章推荐

    1. mysql日志详细解析     http://www.cnblogs.com/wangkongming/p/3684950.html 2. mysql 主从同步实验     http://pmg ...

  7. dojo 官方翻译 dojo/Deferred

    延迟,异步调用 官网地址:http://dojotoolkit.org/reference-guide/1.9/dojo/Deferred.html require(["dojo/Defer ...

  8. Spark机器学习2·准备数据(pyspark)

    准备环境 anaconda nano ~/.zshrc export PATH=$PATH:/anaconda/bin source ~/.zshrc echo $HOME echo $PATH ip ...

  9. 【Java】仿真qq尝试:用户注册(三)

    需求: 实现用户名和密码存入数据库. 思路: 1.连接数据表用静态加载块 2.crud写成4个静态方法 具体流程: from:https://www.tutorialspoint.com/jdbc/j ...

  10. 14.python模块之subprocess

    我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell.那么我们如何通过Python来完成这些命令行指令的执行呢?另外,我们应该知道的是命令行指令的执行通常有两 ...