Android 音视频笔记:获取音频时间

2020-12-22  本文已影响0人  silencefun

0.媒体库查找

  String SELECTION = MediaStore.Audio.AudioColumns.SIZE + " >= ? AND " + MediaStore.Audio.AudioColumns.DURATION + " >= ?";

  long filterSize = 100* 1024L;
  long filterTime =100* 1000L;

   Cursor cursor = context.getContentResolver().query(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        new String[]{
                BaseColumns._ID,
                MediaStore.Audio.AudioColumns.IS_MUSIC,
                MediaStore.Audio.AudioColumns.TITLE,
                MediaStore.Audio.AudioColumns.ARTIST,
                MediaStore.Audio.AudioColumns.ALBUM,
                MediaStore.Audio.AudioColumns.ALBUM_ID,
                MediaStore.Audio.AudioColumns.DATA,
                MediaStore.Audio.AudioColumns.DISPLAY_NAME,
                MediaStore.Audio.AudioColumns.SIZE,
                MediaStore.Audio.AudioColumns.DURATION
        },
        SELECTION,
        new String[]{
                String.valueOf(filterSize),
                String.valueOf(filterTime)
        },
        MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

然后操作cursor.
对于不在媒体库中的需要根据文件路径来:
1.MediaPlayer根据url/path

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
mediaPlayer.getDuration(); 

2.使用MediaMetadataRetriever,根据path可以获取音视频

  /**
 * get Local video and audio duration
 *
 * @return
 */
public static int getLocalVideoDuration(String videoPath) {
    //时长(毫秒)
    int duration;
    try {
        MediaMetadataRetriever mmr = new  MediaMetadataRetriever();
        mmr.setDataSource(videoPath);
        duration = Integer.parseInt(mmr.extractMetadata
                (MediaMetadataRetriever.METADATA_KEY_DURATION))/1000;
    } catch (Exception e) {
        e.printStackTrace();
        return 0;
    }
    return duration;
}

法获取的duration可能不准确,对于VBR格式,duration可能远远比真实的长度小。对于这个问题,可以用比特率和文件大小来计算。

其他补充

1.MediaPlayer(362): error (-38, 0)

场景
1.在初始化MediaPlayer时,通过create方法设置数据源。则不能写MediaPlayer.prepare()方法,这时,会报错。

2.在mediaPlayer.reset()后调用了mediaPlayer.getDuration()在没有给mediaPlayer对象设置数据源之前,是不能使用getDuration等这些方法的。

重点:在列表适配器中 使用getDuration()出错,
顺序正确但不生效,例如在列表中适配器每个item创建了N个MediaPlayer对象,都是使用MediaPlayer的getDuration()获取时长。建议更换获取方式MediaMetadataRetriever。

2.stop之后再次start播放失败

把原先的stop代码

 voice.stop()

改成

voice.pause();
voice.seekTo(0);
上一篇 下一篇

猜你喜欢

热点阅读