您seekTo()
基于偏移量实施的目标是新颖的,但同样存在多个挑战。在进入实现之前,先对和进行seekTo()
一些说明。这两个类都在内部使用一个对象来检索信息。因此不包括类。MediaPlayer
MediaMetadataRetriever
MediaExtractor
metadata
MediaPlayer
MediaMetadataRetriever
首先,让我们考虑提取比特率。MediaPlayer
是一个应该支持多种文件格式的通用实现。因此,对于您的设计,您需要确保bitrate
参数是由系统支持的所有文件格式提取的,例如视听格式,例如,,MP4
等或仅音频格式,例如等。在最新的 android 实现中,我发现只是通过密钥暴露比特率。MPEG-2 TS
AVI
Matroska
WAV
MP3
MP3Extractor
kKeyBitrate
接下来,谈到您的算法,我发现基于大小的搜索存在以下挑战。
audio
和video
轨道以交错方式存储。因此,time * bitrate (in bytes)
由于输入数据的交错性质,不会直接有帮助。
需要考虑起始偏移量。在文件中,有一些metadata
或boxes
存储在文件的开头是特定于文件格式的。您还必须考虑这个偏移量,这对于不同的格式会有所不同。
如果您的输入有更多 mnumber 轨道,如audio
, video
,text
或者更确切地说audio
是电影中的多个轨道,那么问题将变得更加复杂。
视频帧的大小通常不规则。即使采用恒定比特率模型,视频帧大小也可能因帧类型而显着变化。通常,与orI-frame / IDR-Frame in H.264
相比,an 可以消耗大量位。这将对基于大小的实现带来实际困难。就I 和 P 帧的帧大小而言,可以很容易地观察到1:5的比例P-frame
B-frame
seekTo()
您已经承认的可变比特率模型有一定的影响。因此,我跳过这一点。
有了上述几点,在不让您灰心的情况下,我觉得size
基于实现看起来很困难。