ios - (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,这会破坏目的。
解决方案
推荐阅读
- sql-server - 具有列名的多列的 MAX
- sql - 如何在 SQL Server 中获取累积总和(Z=Z+A+BC)
- r - 使用 R 从谷歌驱动器下载 csv
- google-cloud-platform - 大三角帆 | webhook 作为舞台
- kubernetes - Kubernetes - 部署/副本集
- c++ - 错误:重新定义 'get_pointer'T* get_pointer(T* p) c++11
- python - 我在 python 上打开日志文件时丢失了数据
- flutter - 带有颤振的 SocketIO
- c - c中的二维结构数组
- java - 如何从 Generic 类型创建父类的实例,然后使用它来调用子类方法?