【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等

这篇具有很好参考价值的文章主要介绍了【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍Ogg文件格式🍭
😎金句分享😎:🍭子曰:见贤思齐焉,见不贤而内自省也。——《论语·里仁篇》。意思是,看见德才兼备的人就向他学习,希望能向他看齐;看见不贤的人,就反省自己有没有和他一样的缺点,有要改正。🍭

文章未经允许,不许转载 !!!

opus、Ogg 相关文章:
1、RFC3533 :Ogg封装格式版本 0(The Ogg Encapsulation Format Version 0)
2、Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等
3、libogg库详解介绍以及使用——附带libogg库解析.opus文件的C源码
4、RFC7845:Opus音频编解码器的Ogg封装(Ogg Encapsulation for the Opus Audio Codec)
5、opus编解码库(opus-1.4)详细介绍以及使用——附带解码示例代码
6、opus编码的Ogg封装文件详解


【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄一、Ogg 概述

Ogg是一个自由且开放标准的多媒体文件格式,由Xiph.Org基金会所维护。Ogg格式并不受到软件专利的限制,并设计用于有效率地流媒体和处理高质量的数字多媒体。

与大多数容器格式一样,它封装了原始的压缩数据,并允许在一种方便的格式中交错存储音频和视频数据。

Ogg 这个词汇通常意指Ogg Vorbis此一音频文件格式,也就是将Vorbis编码的音效包含在Ogg的容器中所成的格式。在以往,.ogg 此一扩展名曾经被用在任何Ogg支持格式下的内容,但在2007年,Xiph.Org 基金会为了向后兼容的考虑,提出请求,将.ogg只留给Vorbis格式来使用。 Xiph.Org基金会决定创造一些新的扩展名和媒体格式来描述不同类型的内容,像是只包含音效所用的.oga,包含或不含声音的影片(涵盖 Theora)所用的.ogv和程序所用的.ogx

更多关于Ogg的资料可以到Ogg官网学习:https://xiph.org/ogg/

描述Ogg封装格式的 RFC3533 文档:https://www.xiph.org/ogg/doc/rfc3533.txt 或 https://datatracker.ietf.org/doc/html/rfc3533

原文链接:https://blog.csdn.net/wkd_007/article/details/134150061

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄二、Ogg 支持的编码格式

Ogg意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。
下面是Ogg支持的编码格式:

  • 音频

    • 有损
      • Speex:以低比特率处理语音数据(〜2.1-32 kbit / s /通道)
      • Vorbis:处理中高级可变比特率(每通道≈16-500kbit / s)的一般音频数据
      • Opus:以低和高可变比特率处理语音,音乐和通用音频(每通道≈6-510kbit / s)
    • 无损
      • FLAC:处理文件和高保真音频数据。
    • 未压缩
      • OggPCM:处理未压缩的PCM音频。它与WAV大致相当[5]。
  • 视频

    • 有损
      • Theora:基于On2的VP3,它的目标是与MPEG-4视频(例如,使用DivX或Xvid编码),RealVideo或Windows Media Video进行竞争。
      • Daala:正在开发的视频编码格式。
      • Dirac:由BBC开发的免费开放视频格式。使用小波编码[6]。
      • Tarkin:实验项目,现在过时的视频编解码器在2000年,2001年和2002年开发利用离散小波变换的三个维度的宽度,高度和时间。[7][8][9]。在Theora成为视频编码的主要焦点之后,已被搁置(2002年8月)[10]。
    • 无损
      • Dirac:Dirac规范的一部分涵盖无损压缩。
      • Daala:正在开发的视频编码格式。
  • 文本

    • Writ:用于嵌入字幕或字幕的文本编解码器的草稿不完整,于2007年停止[11]。
    • CMML:用于定时元数据,字幕和格式的文本/应用编解码器。
    • Annodex:CSIRO开发的免费开源标准,用于注释和索引网络媒体。
    • OggKate:最初设计用于卡拉OK和文本的重叠编解码器,可以在Ogg中复用。

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄三、Ogg 基础知识

✨3.1 Ogg 相关术语

  • 物理比特流:Ogg封装的结果,被称为物理(Ogg)比特流,也就是说.ogg文件属于一个物理比特流。
  • 逻辑比特流:Ogg封装了一个或多个编码器创建的比特流,称为 逻辑比特流,例如:Vorbis编码的流,Theora编码的流等。
    每个逻辑比特流都以一个特殊的起始页(bos=beginning of stream)开始,并以一个特定的页(eos=end of stream)结束。
  • 分包(packet):Ogg封装过程中,逻辑比特流会被拆分为一系列数据包(packet),它们不包含边界信息地串在一起。
  • 页(page):页(page)是Ogg物理比特流的基本组成单位。Ogg比特流由一个个大小可变的页(page)组成,页的大小通常为4-8 kB,最大65307字节。
  • 段(segments):由于页的最大大小约为64k字节,封装时有些数据包(packet)太大,需要存在几个页里。为了简化过程,Ogg将每个数据包划分为255字节长的块和最后一个较短的块,这些块被称为“Ogg段”(Ogg Segments)。假设一个数据包(packet)大小为520字节,那么它会被分成三个段,大小分别为:255字节、255字节、10字节。
    (疑问:有没有可能有些数据包很小,使得一页中包含很多个数据包?)

✨3.2 Ogg 物理比特流类型

  • 分组(Grouping):分组(Grouping)定义了如何在同一物理比特流中逐页交错多个逻辑比特流。例如,在同一比特流中将视频流和音频流交错存储。
  • 链接(Chaining):完整的逻辑比特流被连接在一起。

看下图例子加深理解:在这个例子中,有两个链接的物理比特流,第一个是由三个逻辑比特流A、B和C组成的分组流。第二个物理比特流D链接在分组比特流的末尾之后,分组比特流在其所有分组逻辑比特流的最后一个eos页之后结束。
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

✨3.3 Ogg 封装过程

Ogg 封装过程:
1、编码器提供的比特流作为“分包”(Packets)移交给Ogg,分包边界(packet boundaries)取决于编码格式;
2、Ogg封装过程将数据包分割成若干段;
3、将一组连续的段(segments)包装成一个可变长度的页面(page);
4、最后将各个页(page)混合组成一个Ogg物理比特流。

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg
上图是Ogg封装过程的例子:

  • 1、编解码器提供的部分比特流细分为数据包。
  • 2、Ogg封装过程将数据包分割成若干段。本例中的数据包相当大,因此数据包1被分为5个段,其中4个段有255个字节,最后一个较小。数据包2分为4个段,其中3个段有255个字节,最后一个非常小。数据包3分为两个段。
  • 3、封装过程会创建页面,在本例中页面非常小。页面1由数据包1的前三个段组成,页面2包含数据包1中剩余的两个段,页面3包含数据包2的前三页。
  • 4、最后,该逻辑比特流的页面和其他逻辑比特流页面被混合组成一个物理Ogg比特流。

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄四、Ogg 文件结构

从上面内容可知,Ogg文件也属于一个物理比特流。是由一个个页(page)组成的。首先,我们要了解一个页的内容,然后找到Ogg文件的各个页就可以解析Ogg文件了。

✨4.1 Ogg 页(page)格式

Ogg的页(page)由页面头部(page header) 加上该页的各个段(segments)的数据组成。
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

页面头部(page header)中的9个字段具有以下含义:

  • 1、capture_pattern:表示页面开始的4字节字段。它包含4个字符:OggS。它可以帮助解码器找到页面边界,并在解析损坏的流后重新获得同步。一旦发现捕获模式,解码器就通过计算和比较校验和来验证页面同步和完整性。

  • 2、stream_structure_version:1字节,表示该流中使用的Ogg文件格式的版本号(本文档指定版本0)。

  • 3、header_type_flag:这1字节字段中的位标识该页面的特定类型。

    • bit 0x01
      • 被设置:页面包含从上一页继续的数据包的数据。
      • 没设置: 页面包含新的数据包
    • bit 0x02
      • 被设置:这是逻辑比特流(bos)的第一页
      • 没设置:此页面不是首页
    • bit 0x04
      • 被设置:这是逻辑比特流(eos)的最后一页
      • 没设置:这一页不是最后一页
  • 4、granule_position:包含位置信息的8字节字段。例如,对于音频流,它可能包含在包括此页面上完成的所有帧之后编码的PCM样本的总数。对于视频流,它可能包含在此页面之后编码的视频帧的总数。这是对解码器的提示,并给它一些定时和位置信息。其含义取决于该逻辑比特流的编解码器,并在特定媒体映射中指定。特殊值-1(以2的补码表示)表示此页上没有数据包结束。

  • 5、bitstream_serial_number:包含唯一序列号的4字节字段,通过该唯一序列号来识别逻辑比特流。

  • 6、page_sequence_number:包含页面序列号的4字节字段,使得解码器可以识别页面丢失。该序列号在每个逻辑比特流上分别增加。

  • 7、CRC_checksum:包含页面的32位CRC校验和的4字节字段(包括具有零CRC字段的报头和页面内容)。生成多项式为0x04c11db7。

  • 8、number_page_segments:1字节,给出分段表(segment table)中编码的分段条目的数量。

  • 9、segment_table:大小为 number_page_segments 个字节。包含此页中所有段的lacing value。每个字节包含一个 lacing value。

以字节为单位的页面头部大小(total header size)由下式给出:

header_size = number_page_segments + 27 [Byte]

以字节为单位的总页面大小由下式给出:页面头部大小 + 所有lacing_values值之和

page_size = header_size + sum(lacing_values: 1..number_page_segments)[Byte]

✨4.2 Ogg 封装文件解析

这里按照上面的页的格式,演示怎样解析一个Ogg封装的文件,文件可以在这个链接下载:https://download.csdn.net/download/wkd_007/88492683 。

用Notepad打开该文件并查看十六进制模式:

下面是文件第一页的数据:
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

  • capture_pattern字段:值为0x4f、0x67、0x67、0x53,对应字符OggS,表示页起始标志;
  • stream_structure_version字段:值为0x00,表示版本号;
  • header_type_flag字段:值为0x02,表示逻辑比特流(bos)的第一页;
  • granule_position字段:值为0x0,媒体编码相关的参数信息,表示到本页为止逻辑流有0个采样;
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,逻辑比特流序列号;
  • page_sequence_number字段:0x00、0x00、0x00、0x00,页面序列号;
  • CRC_checksum字段:0xdf、0xe2、0x0c、0x1f,32位CRC校验;
  • number_page_segments字段:0x01,表示后面段(segment)的个数,本页有1个段(segment);
  • segment_table:前面指明了只有1个段,所以segment_table大小为1个字节,值为 0x13,表示这个段的大小为0x13个字节。
  • 后面的0x13个字节就是段的内容(上图中浅蓝色背景的字节):0x4f开始到0x00

紧接着是第二页的数据:
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

  • capture_pattern字段:值为0x4f、0x67、0x67、0x53,对应字符OggS,表示页起始标志;
  • stream_structure_version字段:值为0x00,表示版本号;
  • header_type_flag字段:值为0x00,表示不是逻辑比特流(bos)的第一页,也不是最后一页,也不包含从上一页继续的数据包;
  • granule_position字段:值为0x0,媒体编码相关的参数信息,表示到本页为止逻辑流有0个采样;
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,逻辑比特流唯一序列号;
  • page_sequence_number字段:0x01、0x00、0x00、0x00,页面序列号;
  • CRC_checksum字段:0xd4、0x3e、0x3f、0x20,32位CRC校验;
  • number_page_segments字段:0x03,表示后面段(segment)的个数,本页有3个段(segment);
  • segment_table:前面指明了3个段,所以segment_table大小为3个字节,值为 0xff、0xff、0xfe,表示这个3个段的大小分别为为 0xff、0xff、0xfe个字节。后面三个段的总字节数为: 0xff+0xff+0xfe=0x2fc字节。
  • 之后的0x2fc个字节就是三个段的内容(上图中浅蓝色背景的字节,没显示完整):0x4f开始到0x00。这里的起始地址是0x4d,加上0x2fc,就是下一页的地址0x349

紧接着是第三页的数据,起始地址是0x349
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

  • capture_pattern字段:值为0x4f、0x67、0x67、0x53,对应字符OggS,表示页起始标志;
  • stream_structure_version字段:值为0x00,表示版本号;
  • header_type_flag字段:值为0x00,表示不是逻辑比特流(bos)的第一页,也不是最后一页,也不包含从上一页继续的数据包;
  • granule_position字段:值为0x80、0xbb、0x0、0x0、0x0、0x0、0x0、0x0,媒体编码相关的参数信息,小端表示到本页的逻辑流有48000帧(小端0xbb80=48000);
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,逻辑比特流唯一序列号;
  • page_sequence_number字段:0x02、0x00、0x00、0x00,页面序列号;
  • CRC_checksum字段:0x98、0x9d、0xc5、0x56,32位CRC校验;
  • number_page_segments字段:0x33,表示后面段(segment)的个数,本页有51(0x33=51)个段(segment);
  • segment_table:前面指明了51个段,所以segment_table大小为51个字节,值分别为图中蓝色背景部分,每个字节表示各个段的大小。这51个字节的值相加就是后面51个段总字节数:0xff + 0x06 + 0xe5 + 0xab + 0xa2 + 0xa1 + 0xa5 + 0xa3 + 0xdf + 0xab + 0xa7 + 0xa1 + 0xa3 + 0x9d + 0xec + 0xe0 + 0xa4 + 0x9e + 0xb3 + 0xa6 + 0xbe + 0xb8 + 0xb4 + 0xaa + 0xa3 + 0xa2 + 0xa4 + 0x99 + 0x9f + 0x9c + 0x96 + 0x94 + 0x94 + 0x97 + 0x99 + 0x9a + 0xa1 + 0x9e + 0xa0 + 0xa6 + 0xa1 + 0xa0 + 0xaa + 0xa9 + 0xac + 0xa4 + 0xa6 + 0x9d + 0x9a + 0x94 + 0x98 = 8484个字节;
  • 之后的8484个字节就是51个段的内容。第一个段的起始地址是0x397,加上8484,就是下一页的地址0x24bb

紧接着是第四页的数据,起始地址是0x24bb
【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

  • capture_pattern字段:值为0x4f、0x67、0x67、0x53,对应字符OggS,表示页起始标志;
  • stream_structure_version字段:值为0x00,表示版本号;
  • header_type_flag字段:值为0x00,表示不是逻辑比特流(bos)的第一页,也不是最后一页,也不包含从上一页继续的数据包;
  • granule_position字段:值为0x00、0x77、0x01、0x0、0x0、0x0、0x0、0x0,媒体编码相关的参数信息,小端表示到本页的逻辑流有96000帧(小端0x017700=96000);
  • bitstream_serial_number字段:0x23、0x49、0x02、0x11,逻辑比特流唯一序列号;
  • page_sequence_number字段:0x03、0x00、0x00、0x00,页面序列号;
  • CRC_checksum字段:0x25、0x80、0xd7、0x7d,32位CRC校验;
  • number_page_segments字段:0x32,表示后面段(segment)的个数,本页有50(0x32=51)个段(segment);
  • segment_table:前面指明了50个段,所以segment_table大小为50个字节,值分别为图中蓝色背景部分,每个字节表示各个段的大小。这50个字节的值相加就是后面50个段总字节数,这里不计算了,感兴趣自己算。
  • 之后的若干个字节就是50个段的内容。

这里解析了4页,后面的页数依次类推去分析,这个文件有118页,最后一页的话,其header_type_flag字段值为0x04。

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄五、读取Ogg文件的C语言代码

// readOggFile.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 8字节数组转成 unsigned long long
unsigned long long ToULL(unsigned char num[8], int len)
{
	unsigned long long ret = 0;
	if(len==8)
	{	
		int i=0;
		for(i=0; i<len; i++)
		{
			ret |= ((unsigned long long)num[i] << (i*8));
		}
	}
	return ret;
}

// 4字节数组转成 unsigned int
unsigned int ToUInt(unsigned char num[4], int len)
{
	unsigned int ret = 0;
	if(len==4)
	{
		int i=0;
		for(i=0; i<len; i++)
		{
			ret |= ((unsigned int)num[i] << (i*8));
		}
	}
	return ret;
}

int readOggPage(char *oggFile)
{
	typedef struct PAGE_HEADER{  
		char           Oggs[4];        
		unsigned char  ver;
		unsigned char  header_type_flag;
		unsigned char  granule_position[8];
		unsigned char  stream_serial_num[4];
		unsigned char  page_sequence_number[4];
		unsigned char  CRC_checksum[4];
		unsigned char  seg_num;
		unsigned char  segment_table[];
	}PAGE_HEADER;
	
	FILE *fp=fopen(oggFile,"rb");
	
	while(!feof(fp))
	{
		// 1、读取 page_header
		PAGE_HEADER page_header;
		if(1 != fread(&page_header,sizeof(page_header),1,fp))
			break;
		printf("page_num:%03u; ",ToUInt(page_header.page_sequence_number, 4));
		printf("Oggs:%c %c %c %c; ",page_header.Oggs[0],page_header.Oggs[1],page_header.Oggs[2],page_header.Oggs[3]);
		printf("type=%d, granule_position:%08llu; ", page_header.header_type_flag,ToULL(page_header.granule_position, 8));
		//printf("seg_num:%d \n",page_header.seg_num);
		
		// 2、读取 Segment_table
		unsigned char *pSegment_table = (unsigned char *)malloc(page_header.seg_num);
		fread(pSegment_table,sizeof(unsigned char),page_header.seg_num,fp);
		
		// 3、计算段数据总大小
		unsigned int TotalSegSize = 0;
		int i=0;
		for(i=0; i<page_header.seg_num; i++)
		{
			TotalSegSize += pSegment_table[i];
		}
		printf("TotalSegSize:%d \n",TotalSegSize);
		
		// 4、读取段数据
		unsigned char *pSegment_data = (unsigned char *)malloc(TotalSegSize);
		fread(pSegment_data,sizeof(unsigned char),TotalSegSize,fp);
		
		if(page_header.header_type_flag == 4)
			printf("Last 4 Byte: %x %x %x %x\n",pSegment_data[TotalSegSize-4],pSegment_data[TotalSegSize-3], pSegment_data[TotalSegSize-2],pSegment_data[TotalSegSize-1]);
		
		free(pSegment_data);
		free(pSegment_table);
	}
	fclose(fp);
	return 0;
}

int main()
{
	readOggPage("48000Hz-s16le-1ch-ChengDu.opus");
	return 0;
}

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg

🎄六、总结

本文介绍了Ogg支持的编码格式,Ogg的封装过程,Ogg文件结构,以及Ogg的相关术语(物理比特流、逻辑比特流、数据包(packet)、页(page)、段(segment) )等内容。

最后,似乎有点问题,文章只讲了Ogg文件结构和页头部数据,并没有解析各个段的内容。因为段的内容是根据编码不同而变化的,需要再了解跟编码相关的文档如:opus音频编解码器的Ogg封装。这些内容后面单独去分析。

这两天发现了查看RFC文档的一个网址:https://datatracker.ietf.org/,只需要搜索想看的RFC文档,基本都可以搜到。
https://datatracker.ietf.org/doc/rfc7845/,显示格式是标题栏在上面;
https://datatracker.ietf.org/doc/html/rfc7845/,显示格式是标题栏在侧边,个人比较喜欢这个风格。

【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等,音视频基础,音视频,Ogg,Ogg封装格式,Ogg封装过程,libogg
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考文档:
rfc3533:https://datatracker.ietf.org/doc/html/rfc3533
Opus从入门到精通(五)OggOpus封装器全解析:https://juejin.cn/post/6844904016254599175
https://www.cnblogs.com/dylancao/p/8303418.html
https://blog.csdn.net/zyx4843/article/details/51439279文章来源地址https://www.toymoban.com/news/detail-740874.html

到了这里,关于【音视频 | Ogg】Ogg封装格式详解——包含Ogg封装过程、数据包(packet)、页(page)、段(segment)等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频——封装格式原理

    视频解码基础 一、封裝格式 ​ 我们播放的视频文件一般都是用一种 封装格式 封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要 解封装格式 ,看有哪些视频流和哪些音频流,此时的

    2024年02月15日
    浏览(49)
  • 【音视频开发】FFmpeg转换与封装 I - MP4格式

    1 FFmpeg转换与封装 1.1 MP4格式转换 1.1.1 MP4格式标准         FFmpeg支持的媒体封装格式具有多样性与全面性,与此, 我们还可以使用FFmpeg来对媒体格式进行转换与封装 。 在互联网常见的格式中,跨平台最好的应该是 MP4 文件,因为 MP4 文件既可以在PC 平台的Flashplayer中播放,

    2024年02月08日
    浏览(83)
  • 【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

    使用 ffmpeg 命令 从 视频数据 中 提取 音频数据 / 视频数据 保留封装格式 , 封装格式 指的就是 封装 视频数据 的 容器 ; 一个 mp4 格式的视频 , 其 封装容器 就是 mp4 容器 , 其中 封装了 h.264 格式的视频数据 和 aac 格式的 音频数据 ; 执行 命令 , 从 input.mp4 输入文件中 , 提取 音频

    2024年03月23日
    浏览(59)
  • FFmpeg入门详解之19:音视频封装原理简介

    什么是数据封装和解封装? 数据封装(baiData Encapsulation) ,笼统地讲,就是把业务数据映射到du某个封装协议zhi的净dao荷中,然后填充对应协议的包头,形成封装协议的数据包,并完成速率适配。 解封装 ,就是封装的逆过程,拆解协议包,处理包头中的信息,取出净荷中的业

    2023年04月09日
    浏览(50)
  • 【音视频|PCM】PCM格式详解

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍数字音频的PCM格式🍭 😎金句分享😎:🍭子曰:君子不器。 ——《论语·为政篇》。意思是,君子不应像器具那样,只有一种用

    2024年02月08日
    浏览(42)
  • 【FFmpeg】ffmpeg 命令行参数 ⑧ ( 使用 ffmpeg 转换封装格式 | 音视频编解码器参数设置 | 视频 帧率 / 码率 / 分辨率 设置 | 音频 码率 / 采样率 设置 )

    音视频 文件 从 采样 - 处理 - 得到原始数据帧队列 - 音视频编码 - 音视频包队列 - 格式封装 的过程如下 : 封装格式 参考 【音视频原理】音视频 “ 采样 - 编码 - 封装 过程 “ 和 “ 解封装 - 解码 - 播放 过程 “ 分析 ( 视频采集处理流程 | 音频采集处理流程 | 音视频文件解封装

    2024年04月17日
    浏览(85)
  • 【音视频 | Ogg】libogg库详细介绍以及使用——附带libogg库解析.opus文件的C源码

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍libogg库,并给出ligogg库使用的例子🍭 😎金句分享😎:🍭子曰:不患人之不己知,患不知人也。——《论语·学而篇》。意思是,

    2024年02月05日
    浏览(67)
  • 音视频 ffmpeg命令转封装

    保持编码格式: 改变编码格式: 修改帧率: 修改视频码率: 修改视频码率: 修改音频码率: 修改音视频码率: 修改视频分辨率: 修改音频采样率: 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音

    2024年02月10日
    浏览(55)
  • Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

    Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilter

    2024年02月02日
    浏览(70)
  • 音视频——视频流H264编码格式

    我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用 宏快 来发送数据是 杂乱无章 的,就好像在没有 集装箱 出现之前,货物总是随意被堆放到船上。 上货(编码),下货是非

    2024年02月15日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包