Android 播放本地 ts 格式视频
上一篇文件讲述了如何录制 ts 格式的视频,那么如何播放录好的 ts 格式视频呢。
我一开始使用 MediaPlayer + SurfaceView 组合实现,我在代码中加了一个 mp4 格式的过滤,导致我播放时没有播放成功,误以为 MediaPlayer 不支持 ts 格式视频,看许多文档说明,也都是说 MediaPlayer 支持的格式为 mp4,3gp,mkv,webm,让我更确信了这点。
搜索 Google 文档,官方文档说 ExoPlayer 这个播放器功能强大,什么都支持,于是我就去研究这个开源播放器了。不过给大家一个很不错的链接,学习这篇文章基本就足够了。
【https://www.iambigboss.top/post/37754_1_1.html】,默认可以播放本地的 ts 格式视频,但是 1920 x 1080 的却播放不了,后来发现,在创建 MediaSource 时,需要设置 TS 的 Flags,基本如下:
DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory();
defaultExtractorsFactory.setTsExtractorFlags(FLAG_DETECT_ACCESS_UNITS | FLAG_ALLOW_NON_IDR_KEYFRAMES);
return new ExtractorMediaSource.Factory(dataSourceFactory).setExtractorsFactory(defaultExtractorsFactory).createMediaSource(uri);
我测试的时候,发现 FLAG_DETECT_ACCESS_UNITS 这个 flags 对我有效的,github 的 issue 中,有人指出 FLAG_ALLOW_NON_IDR_KEYFRAMES 这个有效。
但是这个也有点问题,播放我的 ts 视频时,它的进度条那里有问题,读不出一些参数,导致进度条无法拖拽控制,无法快进和快退。
后来我尝试了一下 VideoView 这个控件,这个控件也是可以播放 ts 格式视频的,可以使用官方的 MediaController 作为菜单栏控制,也可以自己写一个菜单栏控制,然而我发现 VideoView 内部也是 MediaPlayer 实现的,我仔细读了读我之前的视频播放代码,发现了 mp4 文件过滤的这个问题,去掉之后,发现 MediaPlayer 也是可以播放 ts 格式的,视频的播放时长也可以获取到,可以自定义一个 SeekBar 实现拖拽播放。