FFMPEG视音频编解码学习笔记

2023-10-27

文章转载自:http://www.jianshu.com/p/5c7bec29fdbd

一直对音视频这块比较感兴趣,但是一直不知道从何下手,终于找到了比较好的资料,希望通过接下来的时间好好研究一下FFMPEG相关的知识,这里感谢一下雷霄骅大神,大神虽去但是留下来多少经典的文章,虽然都是通信出身,相比之下太多惭愧,唯有努力学习了。希望通过简书能够记录学习过程中的心得体会,以及觉得重要的知识点,以作备忘。

音视频编码技术基础

我们常见的avi,rmvb,mp4,flv,mkv等格式的视频,他们的后缀代表的是他们的封装格式的不同,就是把视频数据和音频数据按照既定的规范进行打包个和规范。但是这个后缀只是一种简单的方式我们并不能发现他其中的编码标准,通过mac的显示文件简介我们可以看到,他采用了AAC的音频编码和H.264的压缩编码标准。


“loginmovie_mp4”简介.png
  • 视频播放器原理

视频播放的步骤


如上图所示,视频播放主要主要几个步骤主要为:解协议(网络视频) - >解封装->视频解码 ->视音频同步
个人理解可以简单的概括为一下内容:协议有RTMP,HTTP等,解析仪后得到FLV(RTMP协议解析的)等形式的数据。之后我们再对FLV等格式的数据进行解封装,得到的是H.264编码的视频码流和AAC编码的音频码流。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

  • H.264和AAC
    H.264将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量,目前H.264是主流的编码标准,目前主流的直播软件大部分使用的都是这种编码方式。
    AAC音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。
  • 直播和点播的对比
    目前主流的直播软件采用的技术一般都是,RTMP协议+FLV格式+H.264视频编码格式+AAC音频编码格式
    点播平台采用的技术:HTTP协议+FLV格式或MP4格式+H.264视频编码格式+AAC音频编码格式
RGB、YUV像素数据处理

YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色,YUV百度百科介绍

H.264视频码流解析

视频.png


原文:视音频数据处理入门:H.264视频码流解析,包含代码。
H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。1个NALU存储1帧画面的压缩编码后的数据。压缩方法能够将图像数据压缩100倍以上。
他们的结构如下图所示。


结构图


其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。
那么NALU指的是什么呢?由文中的代码可以看到NALU分为多个类型。H264在网络传输的是NALU,NALU的结构是:NAL头+RBSP,实际传输中的数据流如图所示:


NALU的结构图


H264--2--语法及结构对NAL头和RBSP讲解还是比较多的,推荐。
源码中我们提供H.264源码的文件,通过C语言代码的程序能够打印出视频码流解析的数据。如果我们使用ESEyE工具,显示H.264的源数据文件,显示的内容如下:


ESEyE工具显示的效果图


上图中纵坐标代表数据量的大小
I帧 当做一张图片直接压缩 不依赖于其他的帧
P帧 会依赖前面的帧 不在存储 I帧 已经存储的数据
B帧 依赖于前面的帧和后面的帧 双向参考 达到更大的压缩率

AAC音频码流解析

原理:AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。


AAC码流结构图.jpg


其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
原文包含AAC音频码流解析代码

FLV封装格式解析

FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。FLV的结构如下图所示。


FLV结构图


原文包含FLV封装格式解析代码.

后记

看完这几篇博客研究了下C的代码,觉得懵懵懂懂,坚持下去吧,接着学习去吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFMPEG视音频编解码学习笔记 的相关文章

  • 使用 libx264 为 Raspberry pi 编译 Xuggler 时的问题 #2

    我正在尝试编译Xuggler http www xuggle com xuggler 对于 Raspberry Pi 在 Debian 操作系统上运行 又名 Raspbian 我遵循了可用的 基本构建说明 here http www xug
  • 从编码视频文件中提取运动向量

    我正在尝试从编码的 mp4 文件中提取运动矢量数据 在之前的帖子中我发现 一个答案http www princeton edu jiasic cos435 motion vector c http www princeton edu jia
  • 消除 ffmpeg 和 image-magic 命令中的慢速因素

    这些命令的基本思想是创建一个比较 比较定义了过去的一张 jpeg 和现在的一张 jpeg 组合起来 例如它们将相互滑动并显示前后图像 e g https media evercam io v1 cameras 1lowe scnoe com
  • 如何使用Java将h.264直播流编码为RTP数据包

    我正在为 Android 操作系统开发一个应用程序 我需要来自摄像机的实时解码视频流 该视频流使用 h 264 编解码器进行编码 将帧数据转换为 RTP 数据包并将数据包发送到服务器 首先 可以尝试在 PC 上实现从 HDD 中预先录制的视
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • 如何在Android项目中使用libffmpeg.so?

    我正在尝试在 Android 中创建一个屏幕录制应用程序 为此 我使用 FFmpeg 我已经创建了 libffmpeg so 文件 现在我想在 Android 项目中使用相同的方法来调用它的本机函数 我怎样才能做到这一点 本教程提供了有关此
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • ffmpeg:音频样本的字节顺序

    我使用 ffmpeg 的 avcodec 从我的 C 应用程序中的音乐文件中检索原始音频样本 对于我测试的文件 这些文件样本的字节序似乎是小字节序 但我想知道对于我尝试解码的所有文件是否总是如此 即来自 ffmpeg 的实现或至少它的体系结
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • 在 macOS 上为 MoviePy 安装 ffmpeg 失败并出现 SSL 错误

    我正在尝试编写一个 Python 程序 在 Mac OS 10 11 16 上使用 MoviePy 将 MP4 文件转换为 GIF 我用 import moviepy editor as mp 我收到一条错误消息 说我需要打电话imagei
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • OpenCV:如何从网络摄像头获取原始 YUY2 图像?

    你知道如何获得吗raw YUY2来自网络摄像头的图像 使用 OpenCV DirectShow 无 VFW http opencv willowgarage com wiki CameraCapture http opencv willow
  • 如何使用AVAssetWriter将h264流写入视频?

    我想将 h 264 流从服务器传输到视频文件 但是当我使用assetwrite finishwrite XCode 报告 Video var mobile Applications DE4196F1 BB77 4B7D 8C20 7A5D6
  • 转换为 JPEG 时 HEIC 切片损坏

    我在将 HEIC 图像转换为 jpeg 时遇到问题 HEIC 文件是使用运行最新 iOS 公共测试版的 iPhone 拍摄的图像 我正在使用诺基亚提供的库 https github com nokiatech heif 要解析文件并从 HE
  • 将 ffmpeg 编译为独立二进制文件

    我正在尝试编译ffmpeg作为独立的二进制文件 因为我想在 AWS lambda 中使用它 我可以让事情在我正在编译的服务器上正常工作 但是如果我复制二进制文件并从另一台服务器运行它 我会得到 ffmpeg error while load
  • Android 中的 FFMpeg jni?

    我已经构建了 Bambuser http bambuser com opensource 提供的 FFMPEG 可执行文件和库 所以我设法构建了 Android 可执行文件和库 如何在 Eclipse 项目中链接这些库并从 Java 调用
  • C++ OpenCV 3.4 / FFMPEG 3.4.1 VideoWriter 和 MP4 输出文件格式

    我正在运行 Linux 内核 4 9 35 ti r44 的 ARM BeagleBone X 15 Debian 机器 在我的 C Qt 5 应用程序中 我想将 cv Mat 帧保存为 MP4 格式视频 我安装了 libx264 并从头开
  • 如何在 RTMP 流中嵌入 pic_timing SEI 挂钟时间码?

    我需要将我的桌面流式传输到 AWS MediaLive 服务 并且根据要求 我必须在流中包含挂钟时间码 AWS 支持人员善意地通知我 对于 h 264 编码流 我需要提供时间码作为 pic timing SEI 消息 我在 Windows

随机推荐