【Android音视频】MediaMetadataRetriever使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Android音视频】MediaMetadataRetriever使用相关的知识,希望对你有一定的参考价值。

参考技术A

MediaMetadataRetriever是android原生提供的获取音视频文件信息的一个类,我们可以通过这个类的相关方法获取一些基本信息,如视频时长、宽高、帧率、方向、某一帧的图片等。

我们可以通过MediaMetadataRetriever的extractMetadata(int keyCode)的方法获取一些视频的基本信息,以下列出一些常用的:

可以通过getFrameAtTime(long timeUs)获取某一时刻附近的帧图片;API>=28,可以准确获取帧图片,相关方法getFrameAtIndex(...);获取帧图可以应用在 视频封面图 视频裁剪的缩略图 等。

MediaMetadataRetriever还是比较常用的,以上只是简略的列出了MediaMetadataRetriever的一些用法,具体可自行查阅源文件。

在 Styled Media Receiver Chromecast 上播放 M3U8

【中文标题】在 Styled Media Receiver Chromecast 上播放 M3U8【英文标题】:Playing M3U8 on Styled Media Receiver Chromecast 【发布时间】:2014-08-23 00:07:43 【问题描述】:

我正在尝试从我的 Android 发件人播放 M3U8 文件,如下所示:

   metaData = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
    metaData.putString(MediaMetadata.KEY_TITLE, "Demo Video");

    MediaInfo mediaInfo = new MediaInfo.Builder(
            "http://www.corsproxy.com/playertest.longtailvideo.com/adaptive/bbbfull/bbbfull.m3u8")
            .setContentType("application/vnd.apple.mpegurl")
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setMetadata(metaData)
            .build();

player.load(client, mediaInfo, true)
          .setResultCallback(new ResultCallback<RemoteMediaPlayer.MediaChannelResult>() 
           @Override
           public void onResult(RemoteMediaPlayer.MediaChannelResult mediaChannelResult) 
                        Status status = mediaChannelResult.getStatus();
                                     if (status.isSuccess()) 
                                      
                                      
                                      );

但是,我得到了错误

[cast.receiver.MediaManager] Load metadata error 
[cast.player.api.Player] error 
[cast.receiver.MediaManager] Load metadata error
[cast.receiver.MediaManager] Not sending LOAD error as there is no on going LOAD request

这是一个样式化媒体接收器,我的理解是它正在使用媒体播放器库,所以它应该能够处理 M3U8 对吗?所以我认为这可能是我的发件人部分的错误?我是否正确加载了 m3u8 网址?

【问题讨论】:

【参考方案1】:

您可以在解析的 m3u8 条目上尝试 exp/imp 循环,将您的 m3su 属性替换为 u c "movieMetadata"...

private static MediaInfo buildMediaInfo(String title,
        String subTitle, String studio, String url, String imgUrl, String bigImageUrl) 
    MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);

    movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, subTitle);
    movieMetadata.putString(MediaMetadata.KEY_TITLE, title);
    movieMetadata.putString(MediaMetadata.KEY_STUDIO, studio);
    movieMetadata.addImage(new WebImage(Uri.parse(imgUrl)));
    movieMetadata.addImage(new WebImage(Uri.parse(bigImageUrl)));

    return new MediaInfo.Builder(url)
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setContentType(getMediaType())
            .setMetadata(movieMetadata)
            .build();

那么当你有一个 MediaInfo 时......你需要来自某物的播放事件,并且你需要在每个播放项目的末尾有一个循环器,以在下一个 MediaInfo 条目上发出播放事件信号。我使用 CCL lib 构建了循环,它播放 MediaInfo 项目的列表。

【讨论】:

以上是关于【Android音视频】MediaMetadataRetriever使用的主要内容,如果未能解决你的问题,请参考以下文章

在 Styled Media Receiver Chromecast 上播放 M3U8

ChromeCast SDK 专辑封面

为 chromecast 设置 cors 标头

Android 音视频开发 -- Android Mediaprojection 截屏和录屏

Android音视频三:AudioFlinger和HAL

【Android音视频】视频开发优化