第一次写博客,逻辑有点乱,见谅~

Android从API16中更新对字幕追踪的支持,具体是下面几个方法。

Added in API level 16

public void addTimedTextSource (Context context, Uri uri, String mimeType)

public void addTimedTextSource (String path, String mimeType)

public void addTimedTextSource (FileDescriptor fd, long offset, long length, String mimeType)

public void addTimedTextSource (FileDescriptor fd, String mimeType)

以第二方法为例,先看下API注释:

Added in API level 16
Adds an external timed text source file. Currently supported format is SubRip with the file extension .srt, case insensitive. Note that a single external timed text source may contain multiple tracks in it. One can find the total number of available tracks using getTrackInfo() to see what additional tracks become available after this method call.

大致意思就是,MediaPlayer支持外置文件显示字幕,但是现在只支持.SRT格式。这个文件可能有多个追踪器在追踪它,可以通过调用getTrackInfo()方法来获得所有的追踪器。

TrackInfo 共有四种类型,未知,视频,音频,字幕。

Added in API level 16
  public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0;
        public static final int MEDIA_TRACK_TYPE_VIDEO = 1;
        public static final int MEDIA_TRACK_TYPE_AUDIO = 2;
        public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3;

使用

在调用的时候,经常遇到这个错误:

03-29 14:42:38.675: W/System.err(21382): java.lang.RuntimeException: failure code: -38
03-29 14:42:38.675: W/System.err(21382): at android.media.MediaPlayer.invoke(MediaPlayer.java:644)
03-29 14:42:38.675: W/System.err(21382): at android.media.MediaPlayer.addTimedTextSource(MediaPlayer.java:1814)
03-29 14:42:38.675: W/System.err(21382): at android.media.MediaPlayer.addTimedTextSource(MediaPlayer.java:1778)
03-29 14:42:38.675: W/System.err(21382): at android.media.MediaPlayer.addTimedTextSource(MediaPlayer.java:1710)
03-29 14:42:38.675: W/System.err(21382): at com.demo.devin.fragment.QosDemoFragment$VideoHolder.onPrepared(QosDemoFragment.java:224)

API中告诉我们会抛这些Exception:

Added in API level 16

Throws: IOException - if the file cannot be accessed or is corrupted. IllegalArgumentException - if the mimeType is not supported. IllegalStateException - if called in an invalid state.

经过试验,在OnPrepared的时候调用没有问题!

但是只是调用这个方法是无法工作的,还需要注册响应的listener和调用selectTrack方法。

具体代码如下:(在OnPrepared回调中)

try            {                mMediaPlayer.addTimedTextSource(srtPath,                        MediaPlayer.MEDIA_MIMETYPE_TEXT_SUBRIP);                TrackInfo[] trackInfos = mMediaPlayer.getTrackInfo();                if (trackInfos != null && trackInfos.length > 0)                {                    for (int i = 0; i < trackInfos.length; i++)                    {                        final TrackInfo info = trackInfos[i];                        Log.w(TAG, "TrackInfo: " + info.getTrackType() + " "                                + info.getLanguage());                        if (info.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_AUDIO)                        {                            // mMediaPlayer.selectTrack(i);                        }                        else if (info.getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_TIMEDTEXT)                        {                            mMediaPlayer.selectTrack(i);                        }                    }                }            }            catch (Exception e)            {                e.printStackTrace();            }


之后再注册的OnTimedTextListener中,会触发该回调,再配合TextView就是实现字幕了,Android已经做好了同步功能!

以上是我在播放MP4流时,可以正常工作!但是在播放M3U8流时,不能工作还是抛了RunTimeException这个异常,可能和MediaPlayer的OnPrepared机制有关。

目前还没有找到什么办法,解决这个问题....

尝试过等视频播放起来后在调用这个方法还是不行~


如果哪位已经解决了,请告诉我下,谢谢。



Added in  API level 16

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android应用程序绑定服务(bindService)的过程源代码分析(3)
  5. android BroadcastReceiver遇到 java.lang.IllegalAccessExcepti
  6. Android(安卓)动态链接库 So 的加载
  7. tabactivty中加入地图
  8. Android(安卓)调用系统相机拍照保存以及调用系统相册的方法
  9. android Beam

随机推荐

  1. How to develop and package Android(安
  2. Screen and UI Performance
  3. Android(安卓)隐藏Fragment
  4. 选择对话框
  5. Android获取手机屏幕参数的工具
  6. Android——ImageView设置圆形边框
  7. android uid gid
  8. android中获取手机短信,删除短信功能
  9. Aandroid 关于处理个推透传消息
  10. Java W3C 生成 XML