Как решить, когда MPMediaItem assetURL равен нулю?
Я работаю над кодом, который просматривает видео пользователя и передает их AVPlayer посредством AVPlayerItem, который принимает URL.
Чтобы получить все видео на устройстве iOS, вы можете сделать:
let videoNumber = MPMediaType.anyVideo.rawValue
let predicate = MPMediaPropertyPredicate.init(value: videoNumber, forProperty: MPMediaItemPropertyMediaType)
let query = MPMediaQuery.init()
query.addFilterPredicate(predicate)
if let items = query.items
{
mediaCollection = MPMediaItemCollection(items: items)
// -1 would indicate an error condition
print("number of items in collection is \(mediaCollection?.count ?? -1)")
}
Когда вы выбираете MPMediaItem, который вы хотите использовать из items
массив, должен быть assetURL
пойти с этим.
Беда, на моем устройстве, все мои assetURL
свойства равны NULL. По совпадению, пока hasProtectedAsset
для каждого из этих предметов есть false
, isCloudItem
для каждого из этих предметов есть true
,
Как я могу придумать действительный assetURL
что я могу передать любому медиаплееру? Похоже на то, что разработчики не могут получить правильные ссылки и доступ к медиафайлам в пользовательской библиотеке iPod.
1 ответ
MPMediaItemPropertyAssetURL/MPMediaItem assetURL имеет значение null/nil по двум причинам.
- Музыка не загружается на ваше устройство, но добавляется только в музыкальную библиотеку.
- Музыка загружена, но защищена DRM.
Актив, защищенный DRM, невозможно воспроизвести с помощью AVPlayer, он может воспроизводиться только с использованием MPMusicPlayer. Поэтому вам необходимо проверить две вещи, прежде чем продолжить работу с AVPlayer.
- MPMediaItemPropertyAssetURL - это ноль?
- MPMediaItem защищен?
Пожалуйста, смотрите код ниже....
let itemUrl = targetMPMediaItem?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
if itemUrl != nil {
let theAsset = AVAsset(url: itemUrl!)
if theAsset.hasProtectedContent {
// Its DRM protected
} else {
// Do whatever you anat to do
}
} else {
//probably the asset is not downloaded to this device
}