Soru MPMediaItem'in iOS'ta DRM korumalı bir ses parçasını temsil etmesi nasıl algılanır?


Bir müzik parçasını temsil eden bir MPMediaItem'in Fairplay / DRM korumalı bir öğe olup olmadığını bilmek istiyorum. Bunu yapmanın herhangi bir yolu var mı?


18
2018-04-06 18:13


Menşei




Cevaplar:


İşte ben böyle yaparım:

MPMediaItem* item;

NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
NSString *title=[item valueForProperty:MPMediaItemPropertyTitle];

if (!assetURL) {
    /*
     * !!!: When MPMediaItemPropertyAssetURL is nil, it typically means the file
     * in question is protected by DRM. (old m4p files)
     */
    NSLog(@"%@ has DRM",title);
}

10
2017-09-13 22:11



Merhaba Guys, lütfen bu DRM korumalı dosyaları AVPlayer kullanarak nasıl çalabiliriz? - ChandraSekhar
AVPlayer eski DRM'yi oynatamaz. Kullanıcıların şu anda olduğu gibi tüm şarkıların satıldığı DRM'yi açmak için parçaları iTunes Plus ile yükseltmeleri gerekiyor. - Brennan
Geçen yıl iTunes'dan aldığım birkaç şarkıyı kontrol ettim ve aynı sorunu gösterdiler - MPMediaItemPropertyAssetURL (null). Dosyalar, iTunes'da "Satın Alınan AAC ses dosyası" olarak gösterilir ve .m4a uzantısına sahiptir. Öyleyse bu sorun hala var gibi görünüyor, ya da öyleyse geri döndü ve yukarıdaki yorumlar bu yana tekrar geldi ...? - arlomedia
DRM ile ilgili yorumunuza, iTunes / iCloud'dan tamamen indirilmemiş parçalar için MPMediaItemPropertyAssetURL dönüşünü de gördüm. Apple Müzik uygulamasında indirme işlemini zorlayarak düzeltildi. - Dan Loughney
Bu kontrol etmek için doğru bir yol değil çünkü MPMediaItemPropertyAssetURL olduğu sıfır değil üzerinde iOS 11 en azından çevrimdışı olarak kaydedilen şarkılar için Apple Müzik ama kesinlikle DRM korumalı ve AVPlayer onları da oynayamaz. Bununla ilgili ayrıntılar için lütfen cevabımı kontrol edin. - Mohit Singh


İOS 4.2'den beri bir yol var. Daha sonra bu örnekte daha etkili bir yol olabilir (ancak benim uygulama için AVPlayerItems'i zaten yaratmam gerekiyordu).

MPMediaItem item;
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *avItem = [[AVPlayerItem alloc] initWithURL:assetURL];
BOOL fairplayed = avItem.asset.hasProtectedContent;

6
2018-06-19 08:21



[İtem valueForProperty: MPMediaItemPropertyAssetURL] bir DRM için nil döndürdüğü için, AVPlayerItem'iniz nil ile oluşturulacak mı? - ıɾuǝʞ
Muhtemelen. Dönen varlık URL'sinin geri döndüğü güvenli bir varsayım mı her zaman korumalı içerik için nil? - voidStern
İOS> 4.2 (4.3.4 tam) ile bir cihazda, assetURL'nin sıfır olup olmadığını kontrol etmeden sorunu çözdüm - ıɾuǝʞ
Şu anda oynanamayan korunmayan öğeler de geri dönecektir. İTunes Match'de çoğunlukla cihaz için yerel olmayan öğeler. - TurqMage
Bu kontrol etmek için doğru yoldur. Ayrıca, MPMediaItemPropertyAssetURL olduğu sıfır değil üzerinde iOS 11 en azından çevrimdışı olarak kaydedilen şarkılar için Apple Müzik fakat AVPlayer onlar oldukları için onları oynayamaz DRM korumalı. Bununla ilgili ayrıntılar için aşağıdaki cevabımı kontrol edin. - Mohit Singh


İOS 4.2'den AVAsset sınıfın bir özelliği var hasProtectedContent kontrol edebilirsiniz:

NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVAsset assetWithURL:assetURL];

if ([asset hasProtectedContent] == NO) {..do your stuff..}

5
2018-05-22 13:30



Bu hasDeğerContent çağrısı göreceli olarak yavaşlıyor; Yaklaşık 100 tane DRMED olmayan şarkıda bir iphone 4S'de yaklaşık 4 saniye sürüyordu. - JosephH
Tabi ki bu iş yapmanın tek yolu. Arka plan kuyruğunda bu kodu eklemek sorunu çözer ve ilerleme çubuğunu görüntüleyebilirsiniz, böylece kullanıcı işlemin diğer işlemler için biraz daha uzun süreceğini bilir. - Josip B.


MPMediaItemPropertyAssetURL olduğu sıfır değil iPhone X'de çalışıyor iOS 11 şarkılar için çevrimdışı kaydedildi üzerinden Apple Müzik fakat AVPlayer onlar oldukları için onları oynayamaz DRM korumalı. Aynı şarkı geri döndü MPMediaItemPropertyAssetURL  sıfır üzerinde iOS 9.

MPMediaItemPropertyAssetURL döner sıfır Kütüphaneye eklenen şarkılar için Apple Müzik fakat çevrimdışı kullanılamaz - her ikisi de iOS 9 ve 11.

Böylece, @ voidStern'in cevabı (ve Justin Kent'in değil), DRM korumalı varlığı test etmek için doğru yoldur.

Swift 4 voidStern'in cevabının versiyonu (benim için mükemmel çalışıyor iOS 9 ila 11):

let itemUrl = targetMPMediaItem?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL
if itemUrl != nil {
    let theAsset = AVAsset(url: itemUrl!)
    if theAsset.hasProtectedContent {
        //Asset is protected
        //Must be played only via MPPlayer
    } else {
        //Asset is not protected
        //Can be played both via AVPlayer & MPPlayer\
    }
} else {
    //probably the asset is not avilable offline
    //Must be played only via MPPlayer
}

DRM korumalı varlığın kontrol edilmesinin bir başka doğru yolu da protectedAsset mülkiyet MPMediaItem - @weirdyu tarafından bir cevap. Ancak, bu özellik sadece iOS 9.2 ve yukarıda.

Swift 4 Bu yöntem için çözüm (benim için mükemmel çalışır iOS 9.2 ve yukarıda):

if #available(iOS 9.2, *) {
    if (targetMPMediaItem?.hasProtectedAsset)! {
        //asset is protected
        //Must be played only via MPMusicPlayer
    } else {
        //asset is not protected
        //Can be played both via AVPlayer & MPMusicPlayer
    }
} else {
    //Fallback on earlier versions
    //Probably use the method explained earlier
}

3
2017-12-07 11:49





iOS9.2 +: Lütfen MPMediaItem "protectedAsset" özelliğini kullanın

iOS9.2-: Hakim MPMediaItem "assetURL" özelliği sıfır değil veya değil


1
2017-11-07 12:25



Bu özellik sadece iOS 9.2 ve üstü sürümlerde kullanılabilir - Mohit Singh
@Mohit Singh Yorumlarınız için teşekkürler, bir şey ekledim. - weirdyu


Justin Kents'in çözümü harika çalışıyor. Yine de blokları kullanmanızı öneririm ya da bir sürü şarkıyla uğraşırsanız UX'in acı çekeceğini düşünürüm:

-(void)checkDRMprotectionForItem:(MPMediaItem*)item OnCompletion:(void (^)(BOOL drmProtected))completionBlock
{
    dispatch_async(_drmCheckQueue, ^{
        BOOL drmStatus;
        NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
        if (!assetURL) {
            drmStatus = YES;
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            if (completionBlock) {
                completionBlock(drmStatus);
            }
    });
    });
}

0
2018-05-19 08:44





Şimdi ios 9 için hızlı 2'yi yapıyorum, kodumu hasProtectedContent kullanarak veya nil url testi kullanarak buldum. Aşağıdaki kod çalışmasını buldum:

    let playerItem = AVPlayerItem(URL: mpMediaItem.assetURL!)
    playableByAVPlayer = (playerItem.status == .ReadyToPlay) ? true : false

Öğe AV Player tarafından oynatılmazsa, bu bir DRM öğesidir ve iPod Player (şimdi SystemMusicPlayer olarak adlandırılır) tarafından oynatılmalıdır.


0
2017-10-04 05:22