1

我正在寻找类seekto()方法使用的字节偏移量MediaPlayer

我想知道是否有办法以某种方式直接检索这些信息,如果没有,是否可以自己计算:如果媒体文件的元数据中有注册比特率,我想在 I 中寻找 10 秒可以使用以下计算:

10(secs)*(bit rate per second)/8

我可以假设使用类MediaPlayer检索比特率信息吗?MediaMetadataRetriever

我已阅读以下内容: MediaPlayer.seekTo(int msecs) 的准确性 并且我知道可变比特率的问题,但我不是在寻找seekto()方法的准确性,而是如何获取/计算它用于获取新数据的偏移量。

4

1 回答 1

1

seekTo()基于偏移量实施的目标是新颖的,但同样存在多个挑战。在进入实现之前,先对和进行seekTo()一些说明。这两个类都在内部使用一个对象来检索信息。因此包括类。MediaPlayerMediaMetadataRetrieverMediaExtractormetadataMediaPlayer MediaMetadataRetriever

首先,让我们考虑提取比特率。MediaPlayer是一个应该支持多种文件格式的通用实现。因此,对于您的设计,您需要确保bitrate参数是由系统支持的所有文件格式提取的,例如视听格式,例如,,MP4等或仅音频格式,例如等。在最新的 android 实现中,我发现只是通过密钥暴露比特率。MPEG-2 TSAVIMatroskaWAVMP3MP3ExtractorkKeyBitrate

接下来,谈到您的算法,我发现基于大小的搜索存在以下挑战。

  1. audiovideo轨道以交错方式存储。因此,time * bitrate (in bytes)由于输入数据的交错性质,不会直接有帮助。

  2. 需要考虑起始偏移量。在文件中,有一些metadataboxes存储在文件的开头是特定于文件格式的。您还必须考虑这个偏移量,这对于不同的格式会有所不同。

  3. 如果您的输入有更多 mnumber 轨道,如audio, videotext或者更确切地说audio是电影中的多个轨道,那么问题将变得更加复杂。

  4. 视频帧的大小通常不规则。即使采用恒定比特率模型,视频帧大小也可能因帧类型而显着变化。通常,与orI-frame / IDR-Frame in H.264相比,an 可以消耗大量位。这将对基于大小的实现带来实际困难。就I 和 P 帧的帧大小而言,可以很容易地观察到1:5的比例P-frameB-frameseekTo()

  5. 您已经承认的可变比特率模型有一定的影响。因此,我跳过这一点。

有了上述几点,在不让您灰心的情况下,我觉得size基于实现看起来很困难。

于 2013-03-24T00:52:27.253 回答