Как воспроизводить файлы фильмов без расширения на iOS с помощью MPMoviePlayerController или AVPlayer? - PullRequest
25 голосов
/ 31 марта 2011

Хочу сыграть фильм в iOS 4.3 на iPad.Я успешно использовал MPMoviePlayerController и AVPlayer для загрузки файлов с удаленного URL-адреса, когда имя файла имеет расширение файла.Однако, когда я использую CDN, который не возвращает имя файла (просто неуловимое случайное имя), ни MPMoviePlayerController, ни AVPlayer, похоже, не справляются.

Есть ли способ сообщить любому плееру, чтоэто действительно фильм типа x, и он просто должен продолжать проигрываться?

MPMoviePlayerController вернет следующую ошибку из уведомления об изменении состояния:

{
    MPMoviePlayerPlaybackDidFinishReasonUserInfoKey = 1;
    error = "Error Domain=MediaPlayerErrorDomain Code=-12847 \"This movie format is not supported.\" UserInfo=0x5b60030 {NSLocalizedDescription=This movie format is not supported.}";
}

Я знаю, что файл являетсядействительный файл m4v, так как когда я переименую его, все в порядке.

Ответы [ 7 ]

8 голосов
/ 08 мая 2013

Файл в tmp

NSString* _filePath

Создать символическую ссылку

NSFileManager *filemgr = [NSFileManager defaultManager];
NSString *slink = [_filePath stringByAppendingPathExtension:@"m4v"];
if (![filemgr fileExistsAtPath:slink]) {
    NSError *error = nil;
    [filemgr createSymbolicLinkAtPath:[_filePath stringByAppendingPathExtension:@"m4v"] withDestinationPath: _filePath error: &error];
    if (error) {
        ...
    }
}
...

Воспроизведение видео slink

4 голосов
/ 31 марта 2012

Если проигрыватель не может угадать формат файла, вам нужно проверить, что CDN отправляет правильный тип пантомимы обратно.Я предполагаю, что ваш CDN не может правильно угадать mimetype и проигрыватель.

В большинстве случаев это связано с тем, как CDN представляет заголовок HTTP. Убедитесь, что в заголовке «Content-Type» установлен видеоформат, соответствующий вашему контенту.

2 голосов
/ 09 марта 2012

Дилан верен.

И MPMoviePlayer, и AVPlayer нуждаются в расширении файла для воспроизведения файла с URL-адреса, в противном случае будет отображено сообщение об ошибке.Лучше использовать какие-то хитрости.

1 голос
/ 02 февраля 2018

WebKit обрабатывает это с помощью опции Private AVURLAsset: AVURLAssetOutOfBandMIMETypeKey, эта опция используется, когда вы указываете тип MIME в теге HTML video,

Вы можете использовать эту опцию как:

NSString * mimeType = @"video/mp4";

// or even with codecs
mimeType = @"video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"";

// create asset
AVURLAsset * asset = [[AVURLAsset alloc] initWithURL:url options:@{@"AVURLAssetOutOfBandMIMETypeKey": mimeType}];

// create AVPlayer with AVURLAsset
AVPlayer * player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];

Поскольку это закрытый ключ, вы можете скрыть его, если планируете отправить его в AppStore.

Источник WebKit можно найти здесь: https://opensource.apple.com/source/WebCore/WebCore-7604.1.38.1.6/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm.auto.html

1 голос
/ 26 августа 2016

Если у вас есть проблемы с получением ContentType вашего соединения, вы можете циклически перебирать воспроизводимые типы MIME и создавать символические ссылки на фактический файл с расширением и проверять, воспроизводятся ли они.Вот так:

NSLog(@"linked path: %@",[videoURL absoluteString]);
NSString* linkedPath;
AVURLAsset* asset;
NSFileManager *filemgr = [NSFileManager defaultManager];

for (NSString* string in [AVURLAsset audiovisualMIMETypes]) {

    if ([string containsString:@"video/"]) {

        NSLog(@"Trying: %@",string);

        linkedPath = [[videoURL absoluteString] stringByAppendingPathExtension:[string stringByReplacingOccurrencesOfString:@"video/" withString:@""]];
        NSLog(@"linked path: %@",linkedPath);

        if (![filemgr fileExistsAtPath:linkedPath]) {
            NSError *error = nil;
            [filemgr createSymbolicLinkAtURL:[NSURL URLWithString:linkedPath] withDestinationURL:videoURL error:&error];
            if (error) {
               NSLog(@"error %@",error.localizedDescription);
            }
        }

       asset = [AVURLAsset assetWithURL:[NSURL URLWithString:linkedPath]];
        if ([asset isPlayable]) {
            NSLog(@"Playable");
            break;
        }else{
            NSLog(@"Not Playable");
            asset = nil;
        }
    }

}
1 голос
/ 22 сентября 2011

iPhone поддерживает видео H.264, MPEG-4 в форматах .mp4, .m4v, .mov и аудиофайлы в AAC, MP3, M4a, Apple без потерь и Audible.Вы можете использовать NSFileManager -contentsOfDirectoryAtPath: error: метод для получения массива с содержимым каталога (в виде строк). Затем вы просто выполняете операции со строками.

0 голосов
/ 13 августа 2011

Это что-то вроде хака, но вы могли бы пропустить каждое имя с помощью метода, который проверяет период с тремя символами после него.Если нет, просто добавьте .m4v автоматически.Или получите тип MIME и автоматически добавьте расширение на основе возвращаемого типа.Если доступно.Посмотрите документацию с NSString для получения дополнительной информации.Удачи!Дайте мне знать, если это помогло.

...