首页 > 解决方案 > AVPlayer:从 aac 文件中提取定时元数据

问题描述

情况:

我有一个由 aac 文件组成的纯音频 HLS 流。我已经确认使用 ffprobe 将定时元数据附加到流中。不幸的是,我无法从 AVPlayer 访问定时元数据。

FFProbe 的输出

~ ffprobe index_1_296.aac
....
Input #0, aac, from 'index_1_296.aac':
  Metadata:
id3v2_priv.com.apple.streaming.transportStreamTimestamp: \x00\x00\x00\x00.\x00\x05\xc0
  Duration: 00:00:06.02, bitrate: 96 kb/s
  Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 96 kb/s

我做了什么:

在包含 AVPlayer 的类中,我扩展了AVPlayerItemMetadataOutputPushDelegate并实现了metadataOutput方法。

代码

我按照我在这里找到的一个例子:https://dcordero.medium.com/hls-timed-metadata-with-avplayer-9e20806ef92f但是下面是实现该metadataOutput方法的代码:

func metadataOutput(_ output: AVPlayerItemMetadataOutput, didOutputTimedMetadataGroups groups: [AVTimedMetadataGroup], from track: AVPlayerItemTrack?) {
        if let item = groups.first?.items.first
        {
            item.value(forKeyPath: #keyPath(AVMetadataItem.value))
            let metadataValue = (item.value(forKeyPath: #keyPath(AVMetadataItem.value))!)
            print("Metadata value: \n \(metadataValue)")
        } else {
            print("MetaData Error")
        }
    }

我所看到的:

当播放包含 .ts 文件的清单时,此metadataOutput方法由定时元数据触发。但是,当我播放仅包含 .aac 文件的清单时,该metadataOutput方法永远不会被触发

可能相关的问题:

问题:

  1. 有没有人成功使用 AVPlayer 从 aac 文件中提取定时元数据?
  2. 有没有人有任何我可以回顾的例子?

标签: avplayerhttp-live-streamingavplayeritem

解决方案


推荐阅读