视音频数据处理
我爬上了高山,山上放了本书,叫做《音视频处理宝典》
1byte ≠ 8bit
大家好,我是黑客,我本来想盗这个哥们的账号的。但是我看这老哥平时就是乐于分享,积极进取,尊老爱幼,与人为善,关键还长的帅,不禁泪水就模糊了双眼。真的,希望大家多多鼓励他,支持他,没事给他支付宝转点钱,激发他的创作热情,让世界充满爱。
展开
-
[Video and Audio Data Processing] UDP-RTP协议解析
0. 概念网络协议数据在视频播放器中的位置如下所示。MPEG-TS封装格式数据打包为RTP/UDP协议然后发送出去的流程如下图所示。图中首先每7个MPEG-TS Packet打包为一个RTP,然后每个RTP再打包为一个UDP。其中打包RTP的方法就是在MPEG-TS数据前面加上RTP Header,而打包RTP的方法就是在RTP数据前面加上UDP Header。基本概念就差不多这些,更多的请看我写的代码注释,以及本文参考链接。1. 代码extern "C"{#ifdef __cpluspl原创 2020-06-30 20:46:47 · 480 阅读 · 0 评论 -
[Video and Audio Data Processing] FLV封装格式解析
0. FLV介绍(https://zh.wikipedia.org/wiki/Flash_Video#tag%E5%9F%BA%E6%9C%AC%E6%A0%BC%E5%BC%8F)FLV包括文件头(File Header)和文件体(File Body)两部分。0.1 音频tag音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。0.2 视频tag视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。0.3 Script Ta原创 2020-06-29 20:39:26 · 261 阅读 · 0 评论 -
[Video and Audio Data Processing] H.264视频码流解析
0. 基本概念0.1 视频码流在视频播放器中的位置如下所示:H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。0.2 更准确来说,原始的NALU单元组成如下:[start code] + [NALU header] + [NALU payload][start code]占3字节或者4字节,为0x000001或0x00000001。而其中[NALU header]又由如下所示构成:forbidden_zero_bit(1bit) + nal_ref_i原创 2020-06-24 15:05:27 · 738 阅读 · 0 评论 -
[Video and Audio Data Processing] AAC音频码流解析
0. AAC介绍AAC音频文件的每一帧都由一个ADTS头和AAC ES(AAC音频数据)组成。以下是wiki的介绍:https://wiki.multimedia.cx/index.php?title=ADTS0.1 其包括固定头信息:adts_fixed_header()ADTS头的固定头信息在每个帧中都是一样的。syncword:帧同步标识一个帧的开始,固定为0xFFFID:MPEG 标示符。0表示MPEG-4,1表示MPEG-2layer:固定为’00’protection_ab原创 2020-06-12 21:28:16 · 479 阅读 · 0 评论 -
[Video and Audio Data Processing]将PCM16LE双声道音频采样数据转换为WAVE格式音频数据
0. 代码代码还是用的雷神写的,我几乎每句代码都写了注解,可以在visual studio 2019成功跑通运行。音源获取地址: https://github.com/leixiaohua1020/simplest_mediadata_testextern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdli原创 2020-06-11 21:38:40 · 398 阅读 · 0 评论 -
[Video and Audio Data Processing] 将PCM16LE双声道音频采样数据转换为PCM8音频采样数据
0. 代码extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Convert PCM-16 data to PCM-8 data. * @param url原创 2020-06-11 21:38:03 · 389 阅读 · 0 评论 -
[Video and Audio Data Processing] 将PCM16LE双声道音频采样数据的声音速度提高一倍
0. 代码extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Re-sample to double the speed of 16LE PCM file原创 2020-06-11 21:37:41 · 250 阅读 · 0 评论 -
[Video and Audio Data Processing] 截取部分PCM16LE单声道音频采样数据
0. 代码extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Cut a 16LE PCM single channel file. * @param原创 2020-06-11 21:35:29 · 269 阅读 · 0 评论 -
[Video and Audio Data Processing] 将PCM16LE双声道音频采样数据中左声道的音量降一半
0. 代码如下extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Halve volume of Left channel of 16LE PCM file原创 2020-06-09 21:08:08 · 411 阅读 · 0 评论 -
[Video and Audio Data Processing] PCM 16 bit左右声道数据分离
0. 代码如下extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Split Left and Right channel of 16LE PCM file.原创 2020-06-08 21:51:44 · 588 阅读 · 0 评论 -
[Video and Audio Data Processing] 计算两个YUV420P像素数据的PSNR
0. 背景主要是对比两张YUV图片中亮度分量Y的PSNR;PSNR通常用于质量评价,就是计算受损图像与原始图像之间的差别,以此来评价受损图像的质量。mse的计算公式如下:PSNR计算公式如下:其中M,N分别为图像的宽高,xij和yij分别为两张图像的每一个像素值。1. 代码分析原图与对比图,差异如下:以下为visual studio 2019可以跑通的代码:extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS原创 2020-06-04 21:56:26 · 475 阅读 · 0 评论 -
[Video and Audio Data Processing] RGB24格式像素数据封装为BMP图像
0. BMP格式重点介绍0.1 BMP采用的是小端(Little Endian)存储方式这种存储方式中“RGB24”格式的像素的分量存储的先后顺序为B、G、R。由于RGB24格式存储的顺序是R、G、B,所以需要将“R”和“B”顺序作一个调换再进行存储。0.2 BMP图像的高度与RGB相反0.3 BMP文件结构BMP文件是由BITMAPFILEHEADER、BITMAPINFOHEADER、RGB像素数据共3个部分构成,它的结构如下图所示。//BITMAPFILEHEADER//BITMAPIN原创 2020-06-04 21:56:02 · 471 阅读 · 0 评论 -
[Video and Audio Data Processing] 分离RGB24像素数据中的R、G、B分量
0. Visual Studio 2019可编译通过的代码如下:RGB24格式的每个像素的三个分量是连续存储的。一帧宽高分别为w、h的RGB24图像一共占用wh3 Byte的存储空间。RGB24格式规定首先存储第一个像素的R、G、B,然后存储第二个像素的R、G、B…以此类推,所以后面的代码就一个简单的for循环遍历,依次把数据取出来。上述调用函数的代码运行后,将会把一张分辨率为500x500的名称为cie1931_500x500.rgb的RGB24格式的像素数据文件分离成为三个文件:output_原创 2020-06-04 21:55:33 · 440 阅读 · 0 评论 -
[Video and Audio Data Processing] 生成灰阶测试图
0. 不逼逼,可以编译通过的代码如下以下写了详细注释:extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Split Y, U, V planes in YUV原创 2020-06-02 22:16:56 · 1742 阅读 · 2 评论 -
[Video and Audio Data Processing] 分离YUV444P像素数据中的Y、U、V分量
0. 前提可参考我的以下博客搭建开发环境:https://blog.csdn.net/Codeliang666/article/details/106161156https://blog.csdn.net/Codeliang666/article/details/106355704新建项目,把lena图放项目里面,lena图从以下地址获取https://github.com/leixiaohua1020/simplest_mediadata_test1. 可以跑通的源代码如下extern原创 2020-06-02 21:41:43 · 786 阅读 · 0 评论 -
[Video and Audio Data Processing] 将YUV420P像素数据去掉颜色(变成灰度图)
0. 代码如下:extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Split Y, U, V planes in YUV444P file. * @param原创 2020-06-02 21:41:21 · 698 阅读 · 0 评论 -
[Video and Audio Data Processing] YUV420P像素数据的亮度减半
0. 修改之后,可以直接编译的代码如下extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Split Y, U, V planes in YUV444P file原创 2020-06-02 21:40:06 · 197 阅读 · 0 评论 -
[Video and Audio Data Processing] YUV420P 图像加边框
1. 正文extern "C"{#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#endif}extern "C" {#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>}/** * Split Y, U, V planes in YUV444P file. * @param ur原创 2020-06-02 21:39:36 · 425 阅读 · 0 评论 -
[Video and Audio Data Processing] YUV 420数据分离
0. 背景本文基于雷神的博客,基于Visual Studio 2019,实现YUV数据分离…话说没想到又见到了大学系主任,讲数字图像处理时候,用到的Lena图…1. 下载源代码,编译YUV播放器从雷神的开源github下载YUVplayer源码,https://github.com/leixiaohua1020/YUVplayer启动Visual Studio,打开刚才下载解压后的yuvplayer.sln文件.升级一下工具集,接下来编译:接下来在release目录下面会找到应用程原创 2020-05-26 21:25:18 · 356 阅读 · 0 评论 -
[Video and Audio Data Processing] 视频的基础参数、分辨率,帧率和码率
1. 图像与像素视频是由连续的图像构成的。每一张图像,我们称为一帧(frame)。图像则是由像素(pixel)构成的。一张图像有多少像素,称为这个图像的分辨率。比如说1920x1080的图像,说明它是由横纵1920x1080个像素点构成。视频的分辨率就是每一帧图像的分辨率。2.帧率一个视频,每一秒由多少图像构成,称为这个视频的帧率(frame-rate)。常见的帧率有24000/1001=23.976, 30000/1001=29.970, 60000/1001=59.940, 25.000, 50转载 2020-05-22 19:44:19 · 1530 阅读 · 0 评论 -
[Video and Audio Data Processing] 封装格式与媒体格式
0. 封装格式(MP4/MKV…) vs 媒体格式(H.264/FLAC/AAC…)你下载的视频文件最多的就是这些。这些文件其实类似一个包裹。它的后缀则是包裹的包装方式。这些包裹里面,包含了视频,音频,字幕等。当播放器在播放的时候,首先对这个包裹进行拆包(专业术语叫做分离/splitting),把其中的视频、音频等拿出来,再进行播放。1. 轨道既然它们只是一个包裹,就意味着这个后缀不能保证里面的东西是啥,也不能保证到底有多少东西。包裹里面的每一件物品,我们称之为轨道(track),一般有这些:视频转载 2020-05-22 19:43:32 · 599 阅读 · 0 评论 -
[Video and Audio Data Processing] 图像的表示方法:RGB模型 vs YUV模型
0. YUV模型介绍光的三原色是红(Red)、绿(Green)、蓝(Blue)。现代的显示器技术就是通过组合不同强度的三原色,来达成任何一种可见光的颜色。图像储存中,通过记录每个像素红绿蓝强度,来记录图像的方法,称为RGB模型 (RGB Model)常见的图片格式中,PNG和BMP这两种就是基于RGB模型的。比如说原图:分别只显示R G B通道的强度,效果如下:三个通道下,信息量和细节程度不一定是均匀分布的。比如说可以注意南小鸟脸上的红晕,在3个平面上的区分程度就不同——红色平面下几乎无从转载 2020-05-22 19:42:09 · 791 阅读 · 0 评论