26

AVPlayerを使用しているときに、httpリクエストを含むヘッダーをオーディオファイルに送信することはできますか?要求されているファイルへのアクセスを制限するために、サーバーが受信したときにヘッダーの内容を検査できる必要があります。

4

6 に答える 6

65

AVURLAssetHTTPHeaderFieldsKeyAVURLAssetinit オプションを使用して、リクエスト ヘッダーを変更できます。

例えば:

NSMutableDictionary * headers = [NSMutableDictionary dictionary];
[headers setObject:@"Your UA" forKey:@"User-Agent"];
AVURLAsset * asset = [AVURLAsset URLAssetWithURL:URL options:@{@"AVURLAssetHTTPHeaderFieldsKey" : headers}];
AVPlayerItem * item = [AVPlayerItem playerItemWithAsset:asset];
self.player = [[AVPlayer alloc] initWithPlayerItem:item];

注: このキーは WebKit のソースで見つけましたが、これはプライベートオプション キーであるため、これを使用するとアプリが AppStore で拒否される可能性があります。

于 2014-05-17T15:23:39.760 に答える
7

などの一般的な HTTP 接続メカニズムを介して、自分でデータを要求する必要がありますNSURLConnection。のヘッダーがテストに合格した場合NSHTTPURLResponseは、それを に保存し、NSCachesDirectoryこのリソースへの URL を次のAVPlayerように渡す必要があります。

NSData *data = //your downloaded data.
NSString *filePath = //generate random path under NSCachesDirectory
[data writeToFile:filePath atomically:YES];

AVPlayer *player = [AVPlayer playerWithURL:[NSURL fileURLWithPath:filePath]];
//...
于 2013-03-16T23:59:30.950 に答える
-3

完全なコードは次のようになります

  #pragma Mark Sound Stuff

- (void)playSound:(NSString *)filePath
{
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:filePath]];
    [playerItem addObserver:self forKeyPath:@"status" options:0 context:0];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(itemDidFinishPlaying) name:AVPlayerItemDidPlayToEndTimeNotification object:playerItem];
    self.audioPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem];
    [self.audioPlayer play];
}

- (void)initSoundPrelisten
{
    //NSLog(@"begin: %s", __FUNCTION__);
    self.activityIndicator.hidden = NO;
    [self.activityIndicator startAnimating];

    // verification delegate : register
    dataProtocol = [[StoreConnection alloc] init];
    [dataProtocol setDelegate:self];
    [dataProtocol requestDataFromServer:[NSString stringWithFormat:@"sound/%@/audio/sample", [self.sound objectForKey:@"globalId"]]];
}

- (void)dataSuccessful:(BOOL)success successData:(NSMutableData *)data;
{
    NSLog(@"%s", __FUNCTION__);
    if (success) {
        //NSLog(@"sound data: %@", data);
        NSString *cacheDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *filePath = [cacheDirectory stringByAppendingPathComponent:@"sample.mp3"];
        //NSLog(@"filePath: %@", filePath);
        [data writeToFile:filePath atomically:YES];
        [self playSound:filePath];

    } else
    {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Store Error" message:[NSString stringWithFormat:@"An Error occured while trying to download sound. Please try again"] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        alertView.tag = 1;
        [alertView show];
    }
}
于 2013-03-27T16:41:49.287 に答える