首页 > 解决方案 > (iOS)无法使用 AVURLAsset 和 AVAsset 阅读器从 RAM 而不是文件读取视频帧

问题描述

我有一个带有自定义资源格式文件的应用程序。在该文件中,有专门用于按原样存储 mp4 文件的字节。我正在尝试播放此 mp4 文件,但无法播放,因为:1) 我无法从文件内的段创建 AVURLAsset。\ 2) 我无法使用数据方案或任何其他方式播放 AVURLAsset这将允许我从 CPU 分配的内存中播放资产。

我目前所做的只是将 mp4 保存到驱动器上它自己的文件中,然后从我刚刚创建的临时文件中播放 mp4。这项工作,但如果使用此文件的应用程序也将使用文件系统,或者以这种方式执行的各种未知的未来问题,则可能会出现问题。

这是用于保存文件的代码:

@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,这会破坏目的。

标签: iosobjective-cmp4nsurlavasset

解决方案


推荐阅读