在Audio Trak 的esds box中
首先是 1、version 和 flag 占4个字节 不使用就跳过
这边的附属内容我要说下 重要的是 这边对codec 解码进行了调整,id 对应表附件1,这边决定了MP3 或者 acc等
4、 MP4DecSpecificDescrTag 读取MP4DecSpecificDescrTag 和len 和附属内容
这边就严重了,这边如果是老的版本 只需如此
但是新的 版本 调整增加了 很多内容
- 主要如上 object type 读取5个bit object type列表见附件2(对codec解码器进行调整,MP3 还是ACC还是 MP3on4)
- 然后 frequency index 读取4个bit frequency index 列表见 附件3(对采样率进行调整)
- 最后channel 读取4个位 列表见附件4 (对声道数进行调整)
附件1 const MP4CodecTag ff_mp4_obj_type[] = { { CODEC_ID_MPEG4 , 32 }, { CODEC_ID_H264 , 33 }, { CODEC_ID_AAC , 64 }, { CODEC_ID_MPEG2VIDEO, 96 }, /* MPEG2 Simple */ { CODEC_ID_MPEG2VIDEO, 97 }, /* MPEG2 Main */ { CODEC_ID_MPEG2VIDEO, 98 }, /* MPEG2 SNR */ { CODEC_ID_MPEG2VIDEO, 99 }, /* MPEG2 Spatial */ { CODEC_ID_MPEG2VIDEO, 100 }, /* MPEG2 High */ { CODEC_ID_MPEG2VIDEO, 101 }, /* MPEG2 422 */ { CODEC_ID_AAC , 102 }, /* MPEG2 AAC Main */ { CODEC_ID_AAC , 103 }, /* MPEG2 AAC Low */ { CODEC_ID_AAC , 104 }, /* MPEG2 AAC SSR */ { CODEC_ID_MP3 , 105 }, /* 13818-3 */ { CODEC_ID_MPEG1VIDEO, 106 }, /* 11172-2 */ { CODEC_ID_MP3 , 107 }, /* 11172-3 */ { CODEC_ID_MJPEG , 108 }, /* 10918-1 */ { CODEC_ID_PNG , 109 }, { CODEC_ID_JPEG2000 , 110 }, /* 15444-1 */ { CODEC_ID_VC1 , 163 }, { CODEC_ID_VORBIS , 221 }, { CODEC_ID_PCM_S16LE , 224 }, { CODEC_ID_QCELP , 225 }, { CODEC_ID_AC3 , 226 }, { CODEC_ID_PCM_ALAW , 227 }, { CODEC_ID_PCM_MULAW , 228 }, { CODEC_ID_PCM_S16BE , 230 }, { CODEC_ID_H263 , 242 }, { CODEC_ID_H261 , 243 }, { CODEC_ID_NONE, 0 },
};1
附件2 MPEG-4 Audio Object Types: ● 0: Null ● 1: AAC Main ● 2: AAC LC (Low Complexity) ● 3: AAC SSR (Scalable Sample Rate) ● 4: AAC LTP (Long Term Prediction) ● 5: SBR (Spectral Band Replication) ● 6: AAC Scalable ● 7: TwinVQ ● 8: CELP (Code Excited Linear Prediction) ● 9: HXVC (Harmonic Vector eXcitation Coding) ● 10: Reserved ● 11: Reserved ● 12: TTSI (Text-To-Speech Interface) ● 13: Main Synthesis ● 14: Wavetable Synthesis ● 15: General MIDI ● 16: Algorithmic Synthesis and Audio Effects ● 17: ER (Error Resilient) AAC LC ● 18: Reserved ● 19: ER AAC LTP ● 20: ER AAC Scalable ● 21: ER TwinVQ ● 22: ER BSAC (Bit-Sliced Arithmetic Coding) ● 23: ER AAC LD (Low Delay) ● 24: ER CELP ● 25: ER HVXC ● 26: ER HILN (Harmonic and Individual Lines plus Noise) ● 27: ER Parametric ● 28: SSC (SinuSoidal Coding) ● 29: PS (Parametric Stereo) ● 30: MPEG Surround ● 31: (Escape value) ● 32: Layer-1 ● 33: Layer-2 ● 34: Layer-3 ● 35: DST (Direct Stream Transfer) ● 36: ALS (Audio Lossless) ● 37: SLS (Scalable LosslesS) ● 38: SLS non-core ● 39: ER AAC ELD (Enhanced Low Delay) ● 40: SMR (Symbolic Music Representation) Simple ● 41: SMR Main ● 42: USAC (Unified Speech and Audio Coding) (no SBR) ● 43: SAOC (Spatial Audio Object Coding) ● 44: LD MPEG Surround ● 45: USAC 附件3 Sampling Frequencies There are 13 supported frequencies: ● 0: 96000 Hz ● 1: 88200 Hz ● 2: 64000 Hz ● 3: 48000 Hz ● 4: 44100 Hz ● 5: 32000 Hz ● 6: 24000 Hz ● 7: 22050 Hz ● 8: 16000 Hz ● 9: 12000 Hz ● 10: 11025 Hz ● 11: 8000 Hz ● 12: 7350 Hz ● 13: Reserved ● 14: Reserved ● 15: frequency is written explictly 附件3
Channel Configurations These are the channel configurations: ● 0: Defined in AOT Specifc Config ● 1: 1 channel: front-center ● 2: 2 channels: front-left, front-right ● 3: 3 channels: front-center, front-left, front-right ● 4: 4 channels: front-center, front-left, front-right, back-center ● 5: 5 channels: front-center, front-left, front-right, back-left, back-right ● 6: 6 channels: front-center, front-left, front-right, back-left, back-right, LFE-channel ● 7: 8 channels: front-center, front-left, front-right, side-left, side-right, back-left, back-right, LFE-channel ● 8-15: Reserved
一文读懂MP4封装格式
简介
MP4或称MPEG-4第14部分(MPEG-4 Part 14)是一种标准的数字多媒体容器格式。扩展名为.mp4。
虽然被官方标准定义的唯一扩展名是.mp4,但第三方通常会使用各种扩展名来指示文件的内容:
同时拥有音频视频的MPEG-4文件通常使用标准扩展名.mp4
仅有音频的MPEG-4文件会使用.m4a扩展名
大部分数据可以通过专用数据流嵌入到MP4文件中,因此MP4文件中包含了一个单独的用于存储流信息的轨道。目前得到广泛支持的编解码器或数据流格式有:
视频格式:H.264/AVC、H.265/HEVC、VP8/9等
音频格式:AAC、MP3、Opus等
文件格式
MP4文件由多个box组成,每个box存储不同的信息,且box之间是树状结构:
随便看一个MP4文件:
查看MP4文件的信息有很多方式,个人比较推荐的:
- https://www.onlinemp4parser.com/
- http://www.bento4.com/
- SteamAnalyzer
这里就借用一个网图,上述图片来自:mp4文件格式解析
一个box由两部分组成:box header、box body。
box header:box的元数据,比如box type、box size。
box body:box的数据部分,实际存储的内容跟box类型有关,比如mdat中body部分存储的媒体数据。
box header中,只有type、size是必选字段。当size==1时,存在largesize字段。如果size==0,表示该box为文件的最后一个box。在部分box中,还存在version、flags字段,这样的box叫做Full Box。当box body中嵌套其他box时,这样的box叫做container box。
我们在最开始展示了一个MP4文件box的图,根结构下一般有4个box(ftyp,free,mdat,moov),下面我们就来了解一下这几个box
ftyp(File Type Box)
一般在文件的开始位置,描述的文件的版本、兼容协议等。
isom(ISO Base Media file)是在 MPEG-4 Part 12 中定义的一种基础文件格式。MP4 文件可能遵循的规范有mp41、mp42,而mp41、mp42又是基于isom衍生出来的。
major_brand:比如常见的 isom、mp41、mp42、avc1、qt等。它表示“最好”基于哪种格式来解析当前的文件。
minor_version:提供 major_brand 的说明信息,比如版本号,不得用来判断媒体文件是否符合某个标准/规范;
compatible_brands:文件兼容的brand列表。
free(Free Space Box)
free box(有的也叫skip),这个可以不用关心,去掉它也不影响解封装。
mdat(Media Data Box)
存放具体的媒体数据。数据结构的意义需要参考metadata(主要在sample table中描述)
moov(Movie Box)
存储mp4文件的metadata信息,“moov”是一个container box,它包含mvhd、track和udta这三个子box。
mvhd(Movie Header Box)
记录整个媒体文件的描述信息,如创建时间、修改时间、时间度量标尺、播放时长等。
一些重要的字段:
creation_time:文件创建时间;
modification_time:文件修改时间;
timescale:一秒包含的时间单位(整数)。举个例子,如果timescale等于1000,那么,一秒包含1000个时间单位(比如track的duration为10,000,那么,track的实际时长为10,000/1000=10s);
duration:影片时长(整数),根据文件中的track的信息推导出来,等于时间最长的track的duration;
rate:推荐的播放速率,32位整数,高16位、低16位分别代表整数部分、小数部分([16.16]),举例 0x0001 0000 代表1.0,正常播放速度;
volume:播放音量,16位整数,高8位、低8位分别代表整数部分、小数部分([8.8]),举例 0x01 00 表示 1.0,即最大音量;
matrix:视频的转换矩阵,一般可以忽略不计;
next_track_ID:32位整数,非0,一般可以忽略不计。当要添加一个新的track到这个影片时,可以使用的track id,必须比当前已经使用的track id要大。也就是说,添加新的track时,需要遍历所有track,确认可用的track id;
track (Track Box)
记录媒体流信息,文件中可以存在一个或多个 track,它们之间是相互独立的。一般的包含一个视频track和一个音频track。
track是container box,至少包含两个子box:tkhd和mdia。
一些重要的字段:
视频:
packets:包含的packets的数量
steam type: 流的类型,比如AVC/H.264 、 AAC
profile: 编码器的profile,如High、Base等
level: 编码器的level
width: 宽
height: 高
aspect ratio: 纵横比, 5:9
音频:
sample rate: 采样率
channels: 声道数
tkhd(Track Header Box)
包含关于媒体流的头信息,跟track中的更细化了!
一些重要的字段:
version:tkhd box的版本;
flags:按位或操作获得,默认值是7(0x000001 | 0x000002 | 0x000004),表示这个track是启用的、用于播放的 且 用于预览的。
Track_enabled:值为0x000001,表示这个track是启用的,当值为0x000000,表示这个track没有启用;
Track_in_movie:值为0x000002,表示当前track在播放时会用到;
Track_in_preview:值为0x000004,表示当前track用于预览模式;
creation_time:当前track的创建时间;
modification_time:当前track的最近修改时间;
track_ID:当前track的唯一标识,不能为0,不能重复;
duration:当前track的完整时长(需要除以timescale得到具体秒数);
layer:视频轨道的叠加顺序,数字越小越靠近观看者,比如1比2靠上,0比1靠上;
alternate_group:当前track的分组ID,alternate_group值相同的track在同一个分组里面。同个分组里的track,同一时间只能有一个track处于播放状态。当alternate_group为0时,表示当前track没有跟其他track处于同个分组。一个分组里面,也可以只有一个track;
volume:audio track的音量,介于0.0~1.0之间;
matrix:视频的变换矩阵;
width、height:视频的宽高;
edts(Edit Box)
它下边有一个elst(Edit List Box),它的作用是使某个track的时间戳产生偏移。
看一下一些字段:
segment_duration: 表示该edit段的时长,以Movie Header Box(mvhd)中的timescale为单位,即 segment_duration/timescale = 实际时长(单位s)
media_time: 表示该edit段的起始时间,以track中Media Header Box(mdhd)中的timescale为单位。如果值为-1(FFFFFF),表示是空edit,一个track中最后一个edit不能为空。
media_rate: edit段的速率为0的话,edit段相当于一个”dwell”,即画面停止。画面会在media_time点上停止segment_duration时间。否则这个值始终为1。
需要注意的问题:
为使PTS从0开始,media_time字段一般设置为第一个CTTS的值,计算PTS和DTS的时候,他们分别都减去media_time字段的值就可以将PTS调整为从0开始的值
如果media_time是从一个比较大的值,则表示要求PTS值大于该值时画面才进行显示,这时应该将第一个大于或等于该值的PTS设置为0,其他的PTS和DTS也相应做调整
mdia(Media Box)
定义了track媒体类型以及sample数据,描述sample信息。
它是一个container box,它必须包含mdhd,hdlr 和 minf。
mdhd(Media Header Atom Box)
mdhd 和 tkhd ,内容大致都是一样的。不过tkhd 通常是对指定的 track 设定相关属性和内容。而 mdhd 是针对于独立的 media 来设置的。
一些重要的字段:
creation_time:当前track的创建时间;
modification_time:当前track的最近修改时间;
timescale: 同mvhd中的timescale,但是需要注意虽然意义相同,但是值有可能不同,下边stts,ctts等时间戳的计算都是以mdhd中的timescale
duration: track的时间长度。
language: 媒体语言码。最高位为0,后面15位为3个字符
hdlr(Handler Reference Box)
主要解释了媒体的播放过程信息。声明当前track的类型,以及对应的处理器(handler)。
handler_type的取值包括:
vide(0x76 69 64 65):video track
soun(0x73 6f 75 6e):audio track
hint(0x68 69 6e 74):hint track
meta(0x6d 65 74 61):Timed Metadata track
auxv(0x61 75 78 76):Auxiliary Video track
minf(Media Information box)
解释 track 媒体数据的 handler-specific 信息,media handler用这些信息将媒体时间映射到媒体数据并进行处理。minf 同样是个 container box,其内部需要关注的内容是 stbl,这也是 moov 中最复杂的部分。
一般情况下,“minf”包含一个header box,一个“dinf”和一个“stbl”,其中,header box根据track type(即media handler type)分为“vmhd”、“smhd”、“hmhd”和“nmhd”,“dinf”为data information box,“stbl”为sample table box。
*mhd (Media Info Header Box)
可分为“vmhd”、“smhd”、“hmhd”和“nmhd”,比如视频类型则为vmhd,音频类型为smhd
vmhd
graphics mode:视频合成模式,为0时拷贝原始图像,否则与opcolor进行合成。
opcolor: 一组(red,green,blue),graphics modes使用。
smhd
balance:立体声平衡,[8.8] 格式值,一般为0表示中间,-1.0表示全部左声道,1.0表示全部右声道。
dinf(Data Information Box)
描述了如何定位媒体信息,是一个container box。
“dinf”一般包含一个“dref”(data reference box)。
“dref”下会包含若干个“url”或“urn”,这些box组成一个表,用来定位track数据。简单的说,track可以被分成若干段,每一段都可以根据“url”或“urn”指向的地址来获取数据,sample描述中会用这些片段的序号将这些片段组成一个完整的track。一般情况下,当数据被完全包含在文件中时,“url”或“urn”中的定位字符串是空的。
stbl(Sample Table Box)
MP4文件的媒体数据部分在mdat box里,而stbl则包含了这些媒体数据的索引以及时间信息。在解析 stbl 前,我们需要了解chunk和sample的概念:
Sample: video sample即为一帧或者一组连续视频帧,audio sample即为一段连续的音频。
Chunk: 一个视频或者音频track中一个或多个sample的组合
stbl 是一个container box,其子box包括:
stsd:sample description box,样本的描述信息。
stts:time to sample box,sample解码时间的压缩表。
ctts:composition time to sample box,sample的CTS与DTS的时间差的压缩表。
stss:sync sample box,针对视频,关键帧的序号。
stsz:sample size box,每个sample的字节大小。
stsc:sample to chunk box,sample-chunk映射表。
stco/co64:chunk offset box,chunk在文件中的偏移。
① stsd(Sample Description Box)
主要存储了编码类型和初始化解码器需要的信息。
这里以视频为例,包含子box:avc1,表示是h.264的视频
data_reference_index:利用这个索引可以检索与当前sample description关联的数据。数据引用存储在data reference box。
width、height:像素宽高。
horizresolution、vertresolution:每英寸的像素值(dpi),[16.16]格式的数据。
frame_count:每个sample中的视频帧数,默认是1。可以是一个sample中有多帧数据。
depth: 位图的深度信息,比如 0x0018(24),表示不带alpha通道的图片;
然后,avc1 box下还有一个avcc,里边会有 sps,pps 等解码必要信息。
② stts(Decoding Time to Sample Box)
包含了一个压缩版本的表,通过这个表可以从解码时间映射到sample序号。表中的每一项是连续相同的编码时间增量(Decode Delta)的个数和编码时间增量。通过把时间增量累加就可以建立一个完整的time to sample表。
重要的字段:
entry_count:表中条目的个数。
sample_count: 连续相同时间长度的sample个数。
sample_delta:以timescale为单位的时间长度。
持续时间相同的连续的 Sample 可以放到一个 entry 里面,以达到节省空间的目的。
③ ctts(composition time to sample box)
这个box提供了decoding time到composition time的offset的表,用于计算pts。
如果一个视频只有I帧和P帧,则ctts这个表就不需要了,因为解码顺序和显示顺序是一致的,但是如果视频中存在B帧,则需要ctts!
这个表在Decoding time和composition time不一样的情况下时必须的。
如果box的version等于0,decoding time必须小于等于composition time,因而差值用一个无符号的数字表示。
有以下公式:CT(n)=DT(n)+CTTS(n)
注:CTTS(n)是未压缩的表的第n个sample对应的offset。
重要字段:
sample_count:连续相同的offset的个数。
sample_offset:CT和DT之间的offset。
④ stss(Sync Sample Box)
它包含media中的关键帧的sample表。关键帧是为了支持随机访问。如果此表不存在,说明每一个sample都是一个关键帧。
重要字段:
sample_number:媒体流中同步sample的序号。
⑤ stsz(Sample Size Box)
包含sample的数量和每个sample的字节大小,这个box相对来说体积比较大的。
重要字段:
sample_size:指定默认的sample字节大小,如果所有sample的大小不一样,这个字段为0。
sample_count:track中sample的数量。
entry_size:每个sample的字节大小。
⑥ stsc(Sample To Chunk Box)
media中的sample被分为组成chunk。chunk可以有不同的大小,chunk内的sample可以有不同的大小。
通过stsc中的sample-chunk映射表可以找到包含指定sample的chunk,从而找到这个sample。结构相同的chunk可以聚集在一起形成一个entry,把一组相同结构的chunk放在一起进行管理,是为了压缩文件大小。这个entry就是stsc映射表的表项。
一些重要的字段解析:
first_chunk:一组chunk的第一个chunk的序号。
chunk的编号从1开始。
samples_per_chunk:每个chunk有多少个sample。
sample_desc_idx:stsd 中sample desc信息的索引,即stsd 表项序号。
⑦ stco/co64(Chunk Offset Box)
Chunk Offset表存储了每个chunk在文件中的位置,这样就可以直接在文件中找到媒体数据,而不用解析box。
需要注意的是一旦前面的box有了任何改变,这张表都要重新建立。
重要字段:
chunk_offset:chunk在文件中的位置。
stco 有两种形式,如果你的视频过大的话,就有可能造成 chunkoffset 超过 32bit 的限制。所以,这里针对大 Video 额外创建了一个 co64 的 Box。它的功效等价于 stco,也是用来表示 sample 在 mdat box 中的位置。只是,里面 chunk_offset 是 64bit 的。
需要注意,这里 stco 只是指定的每个 Chunk 在文件中的偏移位置,并没有给出每个 Sample 在文件中的偏移。想要获得每个 Sample 的偏移位置,需要结合 Sample Size box 和 Sample-To-Chunk 计算后取得。
udta(User Data Box)
用户自定义数据
如何计算一个sample在文件中的偏移?
注意:上边提过了这个的timesacle是mdia/mdhd中的timescale,这里等于1000000
另外也先不考虑edts中偏移的影响!
比如,想要获取时间戳在5.21s的sample在文件中的位置:
那么5.21s在视频时间轴上就是5.21*1000000 = 5210000,其实说白了就是微秒us
查表ctts,根据上边的公式,CT(n)=DT(n)+CTTS(n),计算出DT,就是dts,这里是5210000-200000 = 5010000
查表stts,从Decoding Time to Sample表中将所有sample_count * sample_delta 累加,要<=5010000,找到这个最大的sample的num。这里是第150个,再加1,也就是第151个sample
查表stsc,从sample-to-chunk table查找到对应的chunk number。
151-5 = 146,所以这里对应的是第147个chunk!
查表stco,从chunk offset 表中查找到对应chunk在文件中的起始偏移量。为2830074
最后查 stsz ,得到第 151 个 Sample 的 size 为 31523,因为sample_per_chunk=1,这个chunk里只有这一个sample,所以该chunk中需要读取的sample在文件中的起始偏移量 = 2830074!如果sample_per_chunk不为1,则需要手动加起来!
当然要解码,还需要找到视频的解码数据如sps、pps。
使用FFMpeg将moov前置
为了优化首帧速度,需要将 moov 移到文件前面,此时,需要对 chunk_offset 进行改写。
使用ffmpeg将moov前移很简单,在写文件前设置这个flag即可:
作者:木大白易
音视频学习之ffmpeg常用基础命令整理
基于windows环境安装好必要的ffmpeg后,对ffmpeg基础命令进行一些了解:
FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发
学习交流裙788280672
有时候写入MP4文件会不成功,改成flv就好
编译的时候需要支持 FreeType、FontConfig、iconv,系统中需要有相关的子库,
在 FFmpeg 中增加纯字母水印可以使用 drawtext 滤镜进行支持:
相关使用实例:
为视频添加图片水印可以使用movie滤镜,相关参数:
使用实例:
可以通过overlay将 多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。
相关参数介绍:
从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过 FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布, 下面就来看一下多宫格展示的例子:
15:花屏 绿屏
绿屏的主要是: 无法渲染的画面有些用黑色填充,有些用绿色填充,有些用上一帧画面填充。
===>视频参数改变, 而解码端的SPS&PPS信息未及时重新获取更新,会导致画面无法正常渲染,继而导致绿屏的现象出现。
15.1:全屏花屏:
正常花屏:
==>码率特别低的时候出现的大面积马赛克,编码器每秒产生的视频数据太少。
==>视频参数问题:
======>视频源修改过视频参数(如从720P修改1080P),此时客户端用于解码的SPS&PPS如果没有重新获取的话,就会出现整个画面花屏的现象。
======>不会恢复。
15.2:局部花屏:
SO_SNDBUF的Buffer太小,丢失P帧
P帧丢失。
总结:视频播放时,相关SPS和PPS参数不匹配/丢帧
用户评论
话少情在
终于找到解释MPEG-4格式的网站了!我一直在想如何压缩我的视频文件,降低他们的文件大小,这篇文章简直太详细了,我学会了很多关于编码和解码的过程!
有18位网友表示赞同!
花花世界总是那么虚伪﹌
这个网站讲解得太透彻了,让我一下子就懂了MPEG-4视频格式。以前总是觉得这些专业术语很神秘,现在终于有清晰的解释。
有9位网友表示赞同!
开心的笨小孩
这篇文章说的太对了!MPEG-4就是我喜欢的视频播放标准,画质清晰,文件再也不会太大占用内存了。不过网站里没有提到支持的硬件解码器啊
有14位网友表示赞同!
七级床震
这个網站真的很有帮助!我现在正在学习视频编码技术,MPEG-4是必修课之一。有了这篇文章的解释,我理解了很多以前不懂的概念,真是太棒了!
有8位网友表示赞同!
一生只盼一人
感觉网站里对 MPEG-4 的介绍比较理论化,缺少一些实际应用的例子和场景分析,能不能加入更多关于不同分辨率和编码速度下视频质量的影响?
有7位网友表示赞同!
看我发功喷飞你
这个网站的信息非常有用,尤其是在学习计算机视觉或者数字媒体处理的时候,MPEG-4 了解这篇文章可以作为很好的入门指南。
有11位网友表示赞同!
日久见人心
网页设计有点老旧了,但是信息还是很有价值的! 希望以后能更新一下页面风格,更容易让人阅读和理解。
有20位网友表示赞同!
念初
说实话,这个网站写的有点枯燥乏味,虽然内容很全面,但能不能用更生动的语言表达呢?添加一些图片或者动画效果,可以使文章更容易理解
有8位网友表示赞同!
高冷低能儿
MPEG-4 真是一个伟大的视频格式!它改变了我们观看和分享视频的方式。 这篇文章很好的介绍了MPEG-4 的发展历程和技术原理。
有20位网友表示赞同!
该用户已上天
如果要学习 MPEG-4 视频压缩的细节,我建议去看一些更专业的书籍或课程教材,因为这篇文章只是提供了基本的概述。
有12位网友表示赞同!
情如薄纱
网页加载速度有点慢,感觉信息量很大但是阅读体验不太好
有14位网友表示赞同!
墨染天下
这个网站确实很有用的,它帮助我了解了 MPEG-4 格式的核心要素, 比如不同视频编码技术以及它们在实际应用中的差异。
有18位网友表示赞同!
三年约
MPEG-4 的出现确实推动了数字视频技术的进步。这篇文章对相关的一些历史背景做了一个很好的总结。
有13位网友表示赞同!
灼痛
文章介绍的很全面,包含MPEG-4 的定义、特点、标准以及历史发展进程,非常适合想要了解 MPEG-4 格式的人阅读。
有17位网友表示赞同!
恰十年
我希望网站能提供更多关于实际使用 MPEG-4 格式的案例分析和工具推荐,这样更有助于读者理解它的应用价值。
有14位网友表示赞同!