- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想同时在多个 View 上渲染多个 H264 mp4 视频。目标是阅读大约 8 个短视频,每个大小为 100x100 像素,并让它们同时在屏幕上的多个位置显示其内容。
想象屏幕上有 24 个方 block ,每个方 block 显示 8 个视频池中的一个视频。
MoviePlayer 不工作,因为它只显示一个全屏视频。具有多个 AVPlayerLayer 的 AVPlayer 是有限的,因为只有最近创建的 Layer 会在屏幕上显示它的内容(根据文档和我的测试)。
因此,我编写了一个简短的视频类并为包中的每个 .mp4 文件创建了一个实例,使用 AVAssetReader 读取其内容。更新时,每个视频帧都会根据视频的帧率被检索并转换为 UIImage 并显示。此外,这些图像被缓存以便在循环时快速访问。
- (id) initWithAsset:(AVURLAsset*)asset withTrack:(AVAssetTrack*)track
{
self = [super init];
if (self)
{
NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil];
mOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:settings];
mReader = [[AVAssetReader alloc] initWithAsset:asset error:nil];
[mReader addOutput:mOutput];
BOOL status = [mReader startReading];
}
return self;
}
- (void) update:(double)elapsed
{
CMSampleBufferRef buffer = [mOutput copyNextSampleBuffer];
if (buffer)
{
UIImage* image = [self imageFromSampleBuffer:sampleBuffer];
}
[...]
}
实际上这很有效,但只适用于 4 个视频。第五个永远不会出现。首先我想到了内存问题,但我在以下设备上进行了测试:
我在每台设备上都有相同的行为:平滑循环播放 4 个视频,没有差异。
如果这是内存问题,我希望至少 iPad 2 可以显示 5 或 6 个视频(因为它有更好的硬件)或者 3GS 只显示 1 个或某处崩溃。
不过,模拟器会显示所有视频。
在设备上调试显示,
BOOL status = [mReader startReading];
对于视频 5、6、7 和 8 返回 false。
那么,是否存在某种硬件设置(或限制)不允许超过 4 个同时运行的 AVAssetReader?因为,我无法真正解释这种行为。我不认为所有设备都具有完全相同数量的显存。
最佳答案
是的,iOS 对一次可以解码的视频数量有上限。虽然你的方法很好,但我不知道有什么方法可以解决这个上限,只要同时激活那么多 h.264 解码器。如果你有兴趣,请看看我对这个问题的解决方案,这是一个名为 Fireworks 的 xcode 项目。 .基本上,这个演示展示了将一堆 alpha channel 视频解码到磁盘,然后通过将视频文件的一部分映射到内存来播放每个视频。这种方法可以同时解码 4 部以上的电影,而不会用完所有系统内存,也不会遇到 h.264 解码器对象数量的硬性限制。
关于iphone - iOS 视频 : More than 4 simultaneous AVAssetReaders possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6060565/
我在使用 AVAssetReader 时遇到问题,无法从 iPod 库获取样本并通过音频队列进行流式传输。我无法找到任何这样的示例,因此我尝试实现自己的示例,但似乎 AssetReader 在音频队列
AVAssetReader 很棒,但我只能看到如何将它与本地 Assets 、文件或我猜的组合一起使用, 所以, assetReader = try AVAssetReader(asset: self
我有一个 OpenGL iOS 应用程序,我正在使用 AVAssetReader 从视频中读取帧并使用视频内容为一个简单模型制作纹理。 一切都按预期工作,除了我在辅助线程上使用 AVAssetRead
我正在尝试将示例从 objective-c 转换为 Monotouch,但遇到了一些困难。 基本上我想读取视频文件,并将帧一帧一帧地解码为 opengl 纹理。 这样做的关键是使用 AVAssetRe
我想通过 AVAssetReader 阅读视频样本,但遇到了各种障碍。一些帖子代码可以从应用程序包中名为“Movie.m4v”的视频设置 AVAsset 并使用 AVAssetReader 循环播放视
我正在编写一个 iPad 应用程序,我需要在其中加入不同分辨率的 mp4 文件。为此,我结合使用 AVAssetReader 来读取 mp4 源文件,并使用 AVAssetWriter 将这些源文件写
如何计算使用 AVAssetReader 从 iPod 库获取的歌曲的采样率。我想我可以很容易地获得样本的数量(无论如何我已经成功地读取了样本..),但我不知道在哪里可以获得歌曲的长度(以秒为单位)。
您好,我一直在尝试弄清楚如何在 GPUImage2 中实现电影循环,但到目前为止还没有成功。 GPUImage2 中的 MovieInput 类使用 AVAssetReader 播放电影文件,所以我研
我需要从 AVAsset 中读取音频和视频的原始样本。做这个的最好方式是什么?我可以将多个 AVAssetReaderTrackOutput 对象附加到一个 AVAssetReader。但是 [AVA
我正在使用 AVAssetReader 从视频文件中获取各个帧。我想知道如何播放 Mp4 文件中的音频。 方法[player play]的返回值为false,所以没有声音播放,但是为什么 谢谢。 创建
我正在尝试从 MP3 中获取 PCM 数据。我正在使用 AVAssetReaderOutput,它似乎可以很好地读取数据。 while(true) { nextBuffer = [assetR
我正在使用 AVAssetReader 和 AVAssetReaderTrackOutput 从 iOS 上的 iPod 库中读取音频 Assets 。但是,当我读取数据并将 block 放回原处时,
我已经按照此处讨论的方式实现了搜索(AVAssetReader Seeking),但是在拆除 AVAssetReader 并构建新的 AVAssetReader 时当然会有明显的延迟(因为一旦开始读取
在结合了几个 SO 问题(如 this one)的答案后,我已经设法使用 AVAssetReader 从 MPMediaItem 获取原始数据。和 this one和一个不错的blog post .我
根据我的研究.. 人们一直说它是基于不匹配/错误的格式.. 但我对输入和输出都使用 lPCM 格式.. 你怎么会出错呢?我得到的结果只是噪音..(像白噪音) 我决定只粘贴我的整个代码..也许这会有所帮
如何通过 AVAssetReader 读取音频样本?我找到了使用 AVAssetReader 进行复制或混合的示例,但这些循环始终由 AVAssetWriter 循环控制。是否可以只创建一个 AVAs
我使用assetUrl 从iPod 库中读取歌曲(代码名为audioUrl)我可以以多种方式播放它,我可以剪切它,我可以用它进行一些进动,但是......我真的不明白我要用这个 CMSampleBuf
情况: 我正在尝试使用一些参数导出视频,例如视频比特率、音频比特率、帧速率、更改视频分辨率等。请注意,我让用户以分数设置视频帧速率;喜欢用户可以设置视频帧速率,比如 23.98。 我用 AVAsset
我在我的程序中使用以下代码从录音中提取样本。我以为我理解了这个过程,但是当我阅读 Apples 开发者指南时,我并不完全理解 AVAssetReader 和 AVAssetReaderTrackOut
使用 AVAssetReader 读取文件时出现 Exc_bad_Access 异常。 该文件位于文档目录中,格式为 m4a。这是我正在使用的代码。无法弄清楚我在哪里弄错了: NSArray *pa
我是一名优秀的程序员,十分优秀!