【问题标题】:Exoplayer - How to check if MP4 video has audio?Exoplayer - 如何检查 MP4 视频是否有音频?
【发布时间】:2019-12-30 01:49:02
【问题描述】:

我正在使用来自 API 的 URL。一些 URL 是没有声音的 mp4(视频播放只是没有声音)。如何检查该视频是否有声音?我一直在搜索 SimpleExoPlayer 文档并测试我的 URL 上的方法

https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html 过去几个小时

但我不知道如何检测播放的视频是否有声音。

尝试了getAudioAttributes()、getAudioComponents()中的所有方法,现在只尝试了getAudioFormat(),但它们都返回null。

try{
     Log.d(TAG, "onCreateView: " + player.getAudioFormat().channelCount);
}catch (Exception e){
     Log.d(TAG, "onCreateView: " + e);
}

是的,我已经确定链接实际上有音频。

【问题讨论】:

    标签: android exoplayer exoplayer2.x


    【解决方案1】:

    您可以使用 Player#EventListener#OnTracksChanged 跟踪当前曲目,并使用 Player#getCurrentTrackGroups() 获取当前曲目。如果您浏览轨道组,您可以查找类型。如果您在此处找到 AUDIO 类型,则表示您的视频文件包含音轨。

    如果您还想检查是否选择了任何音轨,则可以查看 Player#getCurrentTrackSelections()。

    【讨论】:

    • 奇怪。当我遍历轨道组时,我可以获得一个 Format 对象(不是类型),它又不包含任何音频参数。你能发布一个代码示例吗?
    • 如何提前知道音轨信息
    【解决方案2】:

    为了完成@Hamza Khan 的回答,这是我检查加载的视频是否有音频的代码:

    override fun onTracksChanged(
        trackGroups: TrackGroupArray?,
        trackSelections: TrackSelectionArray?
    ) {
        if (trackGroups != null && !trackGroups.isEmpty){
            for (arrayIndex in 0 until trackGroups.length){
                for (groupIndex in 0 until trackGroups[arrayIndex].length){
                    val sampleMimeType = trackGroups[arrayIndex].getFormat(groupIndex).sampleMimeType
                    if ( sampleMimeType != null && sampleMimeType.contains("audio") ){
                        //video contains audio
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 感谢分享,不胜感激,有java版的吗?
    • 不抱歉,我写的是完整的 Kotlin。但是,转换很容易。谷歌任何你不明白的东西,尽管 Kotlin 让自己像英语一样被阅读:)
    • 我正在播放一个 HSL 视频,它有 2 个音频并且需要打开用户操作,所以我想我需要先将音频信息保存在数据结构中,然后在用户操作侦听器上我可以设置语言在 trackselector 上...你能在这里指导我吗?
    【解决方案3】:
     player.addListener(new Player.EventListener() {
                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
                    if (trackGroups != null && !trackGroups.isEmpty()) {
                        for (int i = 0; i < trackGroups.length; i++) {
                            for (int g = 0; g < trackGroups.get(i).length; g++) {
                                String sampleMimeType = trackGroups.get(i).getFormat(g).sampleMimeType;
                                if (sampleMimeType != null && sampleMimeType.contains("audio")) {
                                                        //video contains audio
                                }
                            }
                        }
                    }
                }
            }
    

    mrj答案的JAVA版

    遇到这个对我帮助很大的帖子!

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2018-12-28
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多