mp3编解码器也有I/p帧?
mp3 codec also has I/p frame?
我正在用 Android 媒体播放器播放 mp3 文件。
但是当我使用 seekTo(msec) 函数寻找某个随机时间时,每个 android 设备中的每个播放器都显示出细微的差异。时间上的差异大约是1秒。
我很好奇的是 Mp3 MPEG1 音频编解码器也有我 frame/p 帧的东西?我知道是video codec的属性,但是我想知道audio codec是不是也有类似的属性,所以需要跳转到某个位置获取I frame来解码音频。如果是这样,那么这种属性可以产生寻求时间差异是合理的,因为每个玩家开始的时间并不完全相同。
您可能会遇到三个不同的问题。
首先是MP3帧大小。 (这不同于视频 "frame"...在这种情况下,只需将帧视为编码为 MP3 的样本块。)
该帧大小通常为 1,152 个样本。您可以在该级别以下搜索,但需要先在该级别以下解码,并非所有玩家都会这样做。
第二个问题是比特库。帧并不总是需要整个 space,编码器可以返回并用其他帧的数据填充它们,在需要时有效地使用更多带宽,同时保持在恒定比特率内。天真的播放器通常会寻找下一个 MP3 同步字 (11111111 111xxxxx
) 并从那里向编解码器发送数据。由于缺少位库信息,编解码器不会始终具有此时需要解码的信息。它可以播放一点故障声音,或者保持沉默直到它获得足够的信息。这两种行为都存在。
最后,第三个问题是普通的MP3file/stream没有时间戳数据。在不解码到所需搜索点的情况下搜索文件只是猜测。为了提高效率,玩家通常会 "needle drop" 通过猜测他们应该从哪里开始进入流。如果播放器知道你有一个 320 kbit/s CBR 流,并且它知道文件大小有多大,它可以估计文件的时间长度,并简单地平均分配以获得所需的字节偏移量时间。可以想象,即使使用 CBR,这也是不精确的。对于 VBR,一些播放器会使用他们迄今为止看到的平均比特率。其他人根本不允许寻求。其他人会查看第一帧,假设 CBR,并将整个文件视为与第一帧相同的比特率。 (有时播放 VBR 文件并观察结束时间戳在文件的前几秒内发生变化。那是因为播放器正在猜测长度是多少。)
我正在用 Android 媒体播放器播放 mp3 文件。 但是当我使用 seekTo(msec) 函数寻找某个随机时间时,每个 android 设备中的每个播放器都显示出细微的差异。时间上的差异大约是1秒。
我很好奇的是 Mp3 MPEG1 音频编解码器也有我 frame/p 帧的东西?我知道是video codec的属性,但是我想知道audio codec是不是也有类似的属性,所以需要跳转到某个位置获取I frame来解码音频。如果是这样,那么这种属性可以产生寻求时间差异是合理的,因为每个玩家开始的时间并不完全相同。
您可能会遇到三个不同的问题。
首先是MP3帧大小。 (这不同于视频 "frame"...在这种情况下,只需将帧视为编码为 MP3 的样本块。) 该帧大小通常为 1,152 个样本。您可以在该级别以下搜索,但需要先在该级别以下解码,并非所有玩家都会这样做。
第二个问题是比特库。帧并不总是需要整个 space,编码器可以返回并用其他帧的数据填充它们,在需要时有效地使用更多带宽,同时保持在恒定比特率内。天真的播放器通常会寻找下一个 MP3 同步字 (11111111 111xxxxx
) 并从那里向编解码器发送数据。由于缺少位库信息,编解码器不会始终具有此时需要解码的信息。它可以播放一点故障声音,或者保持沉默直到它获得足够的信息。这两种行为都存在。
最后,第三个问题是普通的MP3file/stream没有时间戳数据。在不解码到所需搜索点的情况下搜索文件只是猜测。为了提高效率,玩家通常会 "needle drop" 通过猜测他们应该从哪里开始进入流。如果播放器知道你有一个 320 kbit/s CBR 流,并且它知道文件大小有多大,它可以估计文件的时间长度,并简单地平均分配以获得所需的字节偏移量时间。可以想象,即使使用 CBR,这也是不精确的。对于 VBR,一些播放器会使用他们迄今为止看到的平均比特率。其他人根本不允许寻求。其他人会查看第一帧,假设 CBR,并将整个文件视为与第一帧相同的比特率。 (有时播放 VBR 文件并观察结束时间戳在文件的前几秒内发生变化。那是因为播放器正在猜测长度是多少。)