(iOS) Невозможно прочитать видеокадры с помощью AVURLAsset и AVAsset reader из ОЗУ, а не из файла - PullRequest
0 голосов
/ 04 мая 2020

У меня есть приложение с файлом формата пользовательского ресурса. Внутри этого файла есть байты, предназначенные для хранения файла mp4 как есть. Я пытаюсь воспроизвести этот файл mp4, но не могу, потому что: 1) я не могу создать AVURLAsset из сегмента внутри файла. \ 2) я не могу воспроизвести AVURLAsset со схемой данных или любым другим способом это позволит мне воспроизвести ресурс из выделенной памяти процессора.

В настоящее время я просто сохраняю mp4 в свой собственный файл на диске, а затем воспроизводю mp4 из временного файла, который я только что создал. Это работает, но это может быть проблематично c, если приложение, использующее этот файл, будет также использовать файловую систему, или любые другие неизвестные будущие проблемы, делающие это таким образом.

Вот код, который работает с сохранение файла:

@autoreleasepool {
            NSString *filePath = documentsPathForFileName(@"video.mp4");
            [data writeToFile:filePath atomically:YES];
            NSURL * url = [NSURL fileURLWithPath:filePath];
            frameCounter = 0;
            asset = [AVURLAsset assetWithURL:url];
            if(asset == nil) {
              NSLog(@"Cannot create AVURLAsset");
            } else {

              NSLog(@"Asset: %@", asset);
            }

            if([asset tracksWithMediaType:AVMediaTypeVideo].count == 0) {
              NSLog(@"No Video Track");
            } else if([asset tracksWithMediaType:AVMediaTypeAudio].count == 0) {
              NSLog(@"No Audio Track");
            }
        }

В этом случае я получаю одну видеодорожку и могу прочитать кадры с помощью AVAssetReader.

Вот одна из моих попыток использовать схему данных с base64. , он открывает AVAssetURL, но не находит внутри него никаких дорожек.

        NSString *strData = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        @autoreleasepool {
            NSString* dataFormatString = @"data:video/mp4;base64,%@";

            NSString* dataString = [NSString stringWithFormat:dataFormatString, strData];
            NSURL * url = [NSURL URLWithString:dataString];
            frameCounter = 0;
            asset = [AVURLAsset assetWithURL:url];
            if(asset == nil) {
              NSLog(@"Cannot create AVURLAsset");
            } else {

              NSLog(@"Asset: %@", asset);
            }

            if([asset tracksWithMediaType:AVMediaTypeVideo].count == 0) {
              NSLog(@"No Video Track");
            } else if([asset tracksWithMediaType:AVMediaTypeAudio].count == 0) {
              NSLog(@"No Audio Track");
            }
        }

Я могу создать AVAssetURL, но он не регистрирует дорожки внутри. Неважно, если я попытаюсь использовать fileURLWithPath вместо URLWithString

Я попытался использовать AVAssetResourceDelegateLoader, но я думаю, что для меня потребуется использовать ffmpeg внутри, что победит цель.

...