我目前正在使用 Android Jelly Bean MediaCodec API 来开发一个简单的视频播放器。
我提取曲目,在单独的线程中播放音频和视频。问题是视频轨道总是播放得太快。
问题可能隐藏在哪里?
音频和视频的处理方式几乎相同,除了通过 AudioTrack 播放音频和将视频渲染到表面。
我目前正在使用 Android Jelly Bean MediaCodec API 来开发一个简单的视频播放器。
我提取曲目,在单独的线程中播放音频和视频。问题是视频轨道总是播放得太快。
问题可能隐藏在哪里?
音频和视频的处理方式几乎相同,除了通过 AudioTrack 播放音频和将视频渲染到表面。
如果您以最大速度渲染帧,您将在大多数设备上达到 60fps。您需要根据编码器提供的演示时间戳来调整它的速度。
例如,如果输入是Android 支持的格式(例如典型的.mp4 文件),您可以使用MediaExtractor类来提取每一帧。可以使用 检索时间戳getSampleTime()。您希望通过连续帧上的时间戳之间的差异来延迟渲染——不要假设第一帧的时间戳为零。
此外,不要假设视频帧以恒定速率(例如 30fps)出现。对于某些来源,帧将不均匀地到达。
请参阅 Grafika 中的“播放视频(TextureView)”示例,尤其是SpeedControlCallback类。该gen-eight-rects.mp4视频使用可变帧持续时间来练习它。如果您选中“以 60fps 播放”框,将忽略演示时间戳。