- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个库以使用 AVFoundation 将 Assets 导出到文件。我创建了一个读取器和一个写入器,将输入和输出连接到这些,然后对输入调用 requestMediaDataWhenReadyOnQueue
方法以开始提取数据。提供给此方法的 block 回调看起来有点像这样:
[input requestMediaDataWhenReadyOnQueue:queue usingBlock:^{
while ([input isReadyForMoreMediaData]) {
CMSampleBufferRef buffer;
// The track has some more data for us
if ([reader status] == AVAssetReaderStatusReading
&& (buffer = [output copyNextSampleBuffer])) {
BOOL result = [input appendSampleBuffer:buffer];
CFRelease(buffer);
if (!result) {
// handle error
break;
}
// The track is finished, for whatever reason
} else {
[input markAsFinished]; ⬅
switch ([reader status]) {
// inspect the status and act accordingly
}
}
}
}];
这在 iOS 5 上完美运行,但在 iOS 4 上,代码在标有 ⬅ 箭头的行之后死于 EXC_BAD_ACCESS。经过一番探索后,我觉得在将输入标记为完成后,该 block 以某种方式立即被破坏了。在执行错误行之前完全有效的 self
指针不知何故变成了 0xfff…
或调试器报告的一些垃圾值。但是之前指向它的对象没有问题,正如僵尸工具所确认的那样,它没有被释放。
我错过了什么?
最佳答案
看到相同(相似)的问题。 iOS5开心,iOS4.3.5不开心。有兴趣了解您最终发现的内容。
通过在 requestMedatWhenReadyOnQueue block 之前显式保留写入器、写入器输入、读取器、读取器输出并在 else 子句的最后显式释放所有四个来绕过它。
文档确实说在标记完成后,“该 block 应该退出。”也许他们不是在开玩笑。如果您执行除退出之外的任何操作,则为错误。不过,上述解决方法似乎可行。
更新:我仍然发现它偶尔会崩溃,即使在保留和释放所有 Assets 对象之后也是如此。正如您的问题所观察到的,它在您将编写器输入标记为完成后不久就崩溃了,就好像 block 本身正在被释放一样。而不是仅仅将 block 作为函数的一部分传递。我创建了一个复制的 block 属性,它是一个长生命周期对象的一部分。我用 Block_copy 初始化它,只在长生命周期对象的析构函数中释放它。这似乎可以解决问题。从那以后,我再也没有看到任何 4.3.5 崩溃。
关于objective-c - [AVAssetWriterInput requestMediaDataWhenReadyOnQueue :usingBlock:] 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974679/
无论选择哪种AVVideoWidthKey,AVVideoHeightKey,AVVideoCleanApertureWidthKey,AVVideoCleanApertureHeightKey,我的
我正在使用 AVAssetWriter 分别从 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 附加 CMSampleBuffer 来录制视频和
我正在尝试拍摄图像并将其转换为 Swift 中的视频文件。我能够让代码在 iOS 模拟器中运行,但它无法在实际设备上运行。当我尝试将像素缓冲区附加到 AVAssetWriterInput 时出错。我想
AVAssetWriterInput的readyForMoreMediaData是否在后台线程中更新?如果readyForMoreMediaData为NO,我可以在主线程中阻塞并等待直到该值变为YES
我正在使用 AVAssetWriterInput 从用户那里获取一个 mp3 文件,并通过电子邮件发送(仅限 DRM 免费)。我在使用 PCM 时让进程正常工作,但是当我尝试 mp3、m4a 或 ca
我尝试了以下两种将 UIImage 的像素缓冲区附加到 ASSETWriterInput 的方法。一切看起来都很好,除了视频文件中没有数据。怎么了? 1 适配器类 AVAssetWriterInput
我正在使用 LLSimpleCamera 录制视频。我用后置摄像头录制的很好,但是当我切换到前置摄像头时,应用程序崩溃,报告的错误是 * Terminating app due to uncaught
我正在从 iOS 上的 Unity 应用生成视频。我正在使用 iVidCap,它使用 AVFoundation 来执行此操作。那边一切正常。本质上,视频是通过使用纹理渲染目标并将帧传递给 Obj-C
我正在开发一个需要录制视频的应用程序。从图像中处理人脸后,将存储视频帧。 我可以成功录制视频。但是没有播放音频。 我的代码如下。 - (void)setupAVCapture { frameR
我正在尝试使用 AVAssetWriterInput 裁剪我在应用程序的截屏视频中阅读的视频。这是我当前的配置。 NSDictionary *videoCleanApertureSettings =
我正在编写一个库以使用 AVFoundation 将 Assets 导出到文件。我创建了一个读取器和一个写入器,将输入和输出连接到这些,然后对输入调用 requestMediaDataWhenRead
我正在开发一个同时做两件事的 iOS 应用: 它捕获音频和视频并将它们中继到服务器以提供视频聊天功能。 它捕获本地音频和视频并将它们编码为 mp4 文件以供后代保存。 不幸的是,当我们使用音频单元配置
我正在尝试获取 AVCaptureSession 并将其编码为 mp4。看起来这应该很简单,我正在尝试对单个 960x540 视频流进行编码;出于这个问题的目的,我不担心音频。 当我运行以下代码并使用
我正在尝试使用 AVCaptureSession 在内存中捕获摄像机视频,以便稍后将视频数据写入电影文件。虽然我已经能够成功启动捕获 session ,但我无法使用 AVAssetWriter 将捕获
有人知道如何使用超过 2 个 channel 的 AVAssetWriterInput init 吗? 我正在尝试初始化 audioInput,以这种方式在 AVAssetWriter 之后添加它:
我正在开发一个从磁盘读取媒体数据的应用程序,将其转换为适当的像素格式,然后将其传递给 AVAssetWriter 进行压缩并写入磁盘。我正在做我自己的阅读交错而不是使用 AVAssetReader。我
从 iOS 12.4 beta 版本开始,在 AVAssetWriterInput 上调用 appendSampleBuffer 会记录以下错误: CMSampleBufferGetSampleSiz
我一直在尝试使用 AVAssetWriter 和 AVAssetWriterInputs 编写视频+音频。 我在这个论坛上看到了很多人说他们能够做到这一点的帖子,但它对我不起作用。如果我只是写视频,那
我将示例缓冲区转换为 CGContext。然后我将转换应用到上下文并从中创建一个 CIImage,然后显示在 UIImageView 中。 同时我想将其附加到 AVAssetWriterInput 以
我正在尝试拍摄使用 iVidCap 插件创建的视频并向其添加音频。基本上与这个问题完全相同:Writing video + generated audio to AVAssetWriterInput,
我是一名优秀的程序员,十分优秀!