how to read id3 tags / other metadata from an HLS stream in swift / AVKIT(如何在SWIFT/AVKIT中读取HLS流中的id3标签/其他元数据)
本文介绍了如何在SWIFT/AVKIT中读取HLS流中的id3标签/其他元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试收集一些关于如何从iOS应用程序内的HLS流中读取元数据的知识。 下面的HLS流有一些我想读的ID3标记: HLS test stream
在Safari的Web检查器中,我可以在控制台中看到很多数据对象,每个对象都有元数据:
在Web检查器的网络选项卡中,我可以读取播放列表文件:
#EXTM3U
#EXT-X-VERSION:5
#EXT-X-MEDIA-SEQUENCE:89147
#EXT-X-TARGETDURATION:20
#EXT-X-PROGRAM-DATE-TIME:2019-09-25T11:35:23.401Z
#EXTINF:19.970,
05-20190925T113523Z.aac
#EXTINF:19.970,
05-20190925T113543Z.aac
#EXTINF:19.970,
05-20190925T113603Z.aac
#EXTINF:19.970,
05-20190925T113623Z.aac
#EXTINF:19.970,
05-20190925T113643Z.aac
#EXTINF:19.970,
05-20190925T113703Z.aac
到目前为止,我已经实现了一个使用AVPlayer
实例来播放该流的类。它工作正常。
我将AVPlayer
和AVPlayerItem
中的各种属性打印到Xcode控制台。
但是,我唯一可以解释的属性是AVPlayerItem.currentTime
,它为我提供了播放列表文件中的EXT-X-PROGRAM-DATE-TIME
的值。
所有其他属性似乎都与我在播放列表和id3标签中看到的信息无关。
有没有办法读取每个id3标记中包含的元数据?
如何从播放列表中读取EXT-X-TARGETDURATION
?
我读到了AVPlayerItemMetadataCollector
,但我不明白它应该做什么,以及这是否有助于我读取HLS流中的元数据。
推荐答案
我是这样实现的:
import UIKit
import AVKit
import AVFoundation
import MediaPlayer
class ViewController: UIViewController{
let player = AVPlayer()
var playerItem: AVPlayerItem!
let asset = AVAsset(url: URL(string: "https://db2.indexcom.com/bucket/ram/00/05/05.m3u8")!)
override func viewDidLoad() {
prepareToPlay()
player.play()
}
func prepareToPlay() {
playerItem = AVPlayerItem(asset: asset)
playerItem.addObserver(self, forKeyPath: "timedMetadata", options: [], context: nil)
player.replaceCurrentItem(with: playerItem)
printTimeStamp()
}
func printTimeStamp() {
print("▼⎺▼⎺▼⎺▼⎺▼⎺▼⎺▼⎺▼")
print("PROGRAM-DATE-TIME: ")
print(playerItem.currentDate() ?? "No timeStamp")
print("▲_▲_▲_▲_▲_▲_▲_▲
")
}
override func observeValue(forKeyPath: String?, of: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if forKeyPath != "timedMetadata" { return }
printTimeStamp()
let data: AVPlayerItem = of as! AVPlayerItem
guard let timedMetadata = data.timedMetadata else { return }
for item in timedMetadata {
switch item.commonKey {
case .commonKeyAlbumName?:
print("AlbumName: (item.value!)")
case .commonKeyArtist?:
print("Artist: (item.value!)")
case .commonKeyArtwork?:
print("Artwork: (item.value!)")
case .commonKeyAuthor?:
print("Author: (item.value!)")
case .commonKeyContributor?:
print("Contributor: (item.value!)")
case .commonKeyCopyrights?:
print("Copyrights: (item.value!)")
case .commonKeyCreationDate?:
print("CreationDate: (item.value!)")
case .commonKeyCreator?:
print("creator: (item.value!)")
case .commonKeyDescription?:
print("Description: (item.value!)")
case .commonKeyFormat?:
print("Format: (item.value!)")
case .commonKeyIdentifier?:
print("Identifier: (item.value!)")
case .commonKeyLanguage?:
print("Language: (item.value!)")
case .commonKeyMake?:
print("Make: (item.value!)")
case .commonKeyModel?:
print("Model: (item.value!)")
case .commonKeyPublisher?:
print("Publisher: (item.value!)")
case .commonKeyRelation?:
print("Relation: (item.value!)")
case .commonKeySoftware?:
print("Software: (item.value!)")
case .commonKeySubject?:
print("Subject: (item.value!)")
case .commonKeyTitle?:
print("Title: (item.value!)")
case .commonKeyType?:
print("Type: (item.value!)")
case .id3MetadataKeyAlbumTitle?:
print("id3MetadataKeyAlbumTitle: (item.value!)")
default:
print("other data: (item.value!)")
}
}
}
}
这篇关于如何在SWIFT/AVKIT中读取HLS流中的id3标签/其他元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何在SWIFT/AVKIT中读取HLS流中的id3标签/其他元数据
基础教程推荐
猜你喜欢
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01