问题标签 [avassetreader]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
314 浏览

avfoundation - 如何使用 AVFoundation 从视频流中获取原始格式的图像缓冲区?

在 Apple 的文档中AVAssetReaderTrackOutput,它表示以下有关outputSettings使用实例化实例时的参数+[AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:outputSettings:]

nil 值将输出配置为以指定轨道存储的原始格式提供样本。

当在例如 MP4 视频资产上使用它时,它似乎会按解码顺序逐步遍历帧(即相对于显示无序),但是CMSampleBufferRef对使用CMSampleBufferGetImageBuffer产生NULL CVImageBufferRef对象的传递对象的所有查询。

我可以确保传递图像缓冲区对象的唯一方法是为提供像素缓冲区格式outputSettings:,例如字典条目。kCVPixelFormatType_32ARGBkCVPixelBufferPixelFormatTypeKey

这样做的另一个有趣的副作用是,帧然后按显示顺序传递,而帧的底层解码顺序被抽象/隐藏起来。

任何想法为什么会这样?

0 投票
1 回答
232 浏览

ios - 压缩视频错误:由于内存问题而终止

我想首先修剪从 photoLibrary 中选择的视频,然后将视频文件压缩为自定义大小和比特率。我正在使用 PryntTrimmerView 来修剪视频,然后使用修剪后的视频来压缩视频文件。有我用于修剪和压缩视频文件的代码。我成功导出修剪资产,然后成功获取压缩文件。当我从图库中选择短视频时没有问题,但是在压缩后选择大尺寸视频时,我在控制台中出现此错误:来自调试器的消息:由于内存问题而终止,有我用于修剪和压缩视频文件的代码。

0 投票
1 回答
758 浏览

swift - 压缩我的音频文件后,为什么我不能播放文件?

AVAssetReader使用/减少音频文件后将无法播放AVAssetWriter

目前,整个函数执行良好,没有抛出任何错误。出于某种原因,当我通过终端进入模拟器的文档目录时,音频文件将无法通过 iTunes 播放,并且在尝试使用 quicktime 打开时出现错误“QuickTime Player 无法打开”test1.m4a”

有没有人专门研究这个领域并理解为什么这不起作用?

0 投票
1 回答
1010 浏览

ios - AVAssetReader,如何与流而不是文件一起使用?

AVAssetReader 很棒,但我只能看到如何将它与本地资产、文件或我猜的组合一起使用,

所以,

等等,

假设您有一个到达的流

(也许是 Apple 的 .M3U8 文件示例,

在此处输入图像描述

https://developer.apple.com/streaming/examples/

实际上,AVAssetReader 可以用于流吗?还是只有本地文件?

我只是在任何地方都找不到这个解释。(如果您更熟悉它,也许很明显。:/)

0 投票
2 回答
4442 浏览

ios - 如何为我录制的音频制作波形?

我正在使用 AVFoundation 通过以下设置录制音频。录制成功后,我需要将录制文件的波形展示给用户。谁能帮我完成这项任务?

这是我的录音机设置:

0 投票
0 回答
299 浏览

ios - 尝试读取视频帧时 AVVideoComposition 失败

我有一个源视频,我想通过获取源视频的每一帧的一个区域来从中生成一个新视频。例如,如果我有一个分辨率为Ax B、内容大小为XxY且输出分辨率为CxD的视频,那么我想创建一个分辨率为Cx的视频,D其内容将是原始视频中每帧的前Xx 个像素。Y

为了实现这一点,我使用一个AVAssetReader用于阅读源视频和一个AVAssetWriter用于编写新视频。为了仅提取源视频的区域Xx Y,我使用一个AVAssetReaderVideoCompositionOutput对象作为资产读取器的输出。设置代码类似于:

然后裁剪视频内容的逻辑发生在以下自定义初始化程序中:

此代码在某些情况下可以正常工作,例如,对于 content size (origin = (x = 0, y = 0), size = (width = 1416, height = 1920))。但是,如果我将宽度更改为 1417,则它不起作用,并且我收到错误消息:

Error Domain=AVFoundationErrorDomain Code=-11858“源帧格式不支持” UserInfo={NSUnderlyingError=0x283e689c0 {Error Domain=NSOSStatusErrorDomain Code=-12502“(null)”},NSLocalizedFailureReason=视频无法合成,NSDebugDescription=源帧不支持的格式,NSLocalizedDescription=操作停止}

是一个带有测试视频的示例项目的链接,我得到了错误。这种失败的情况对我来说是随机的,因为它适用于宽度 1416、1421、1422、1423、1429 并且对于 1416 和 1429 之间的所有其他宽度值都失败。这里有什么问题,我该如何解决这个问题?

为什么我使用这种方法?

我使用 anAVAssetReaderVideoCompositionOutput而不是使用 anAVAssetReaderTrackOutput然后手动进行裁剪的原因是因为使用前者可以减少应用程序的内存占用,因为在我的用例中,输出渲染大小将比视频原始大小小得多尺寸。当我同时处理多个视频时,这很重要。

0 投票
1 回答
417 浏览

ios - 使用 AVAssetReader 读取 mp4 文件时丢失第一个音频 CMSampleBuffer

我正在使用 AVAssetWriter 将音频 CMSampleBuffer 写入 mp4 文件,但是当我后来使用 AVAssetReader 读取该文件时,它似乎丢失了初始数据块。

这是传递给写入器输入附加方法的第一个 CMSampleBuffer 的调试描述(注意 1024/44_100 的启动持续时间附件):

这是第二个 CMSampleBuffer 的调试描述(注意 1088/44_100 的启动持续时间附件,它与之前的修剪持续时间相结合产生 2112 的标准值):

现在,当我使用 AVAssetReader 读取音轨时,我得到的第一个 CMSampleBuffer 是:

下一个是包含 1088/44_100 的启动信息:

输入追加方法不断返回true,这原则上意味着所有样本缓冲区都已追加,但读取器由于某种原因跳过了第一块数据。我在这里做错了什么吗?

我正在使用以下代码来读取文件:

0 投票
0 回答
75 浏览

ios - kCMSampleBufferAttachmentKey_TrimDurationAtStart 崩溃

我有以下函数,它获取现有视频文件的 url 并将其压缩到输出文件中。我正在使用 Avasset 读写器。

出于某种原因,我收到以下错误。我的问题是如何设置这个键,更重要的是我为什么要设置它以及设置什么值。什么是编码器延迟?谢谢你

0 投票
1 回答
283 浏览

ios - 从特定视频写入音频时,AVAssetWriter 仅在 iOS 中失败

我有一个用于调整视频大小的示例项目,适用于大多数视频。但是,AVAssetWriter无法从特定视频写入音频并出现错误:

更有问题的是,如果我在 macOS 上运行相同的代码,它可以正常工作,但在 iOS 中它会中断。我认为这不是硬件问题,因为它也会在 iOS 模拟器中中断。

这些是我用于(解)压缩资产轨道的设置:

完整的源代码可以在这里找到。

在该项目中,有两个目标,一个用于 Mac,另一个用于 iOS,它们都使用相同的代码来调整视频大小。我还包括了两个示例视频文件:fruit.mp4rain.mp4. 第一个在两个目标中都运行良好,但第二个在 iOS 中中断。

我在这里遗漏了什么,或者这很可能是苹果的错误?

0 投票
1 回答
264 浏览

multithreading - 使用 AVAssetReader 和 copyNextSampleBuffer 而不进行轮询

我正在使用AVAssetReader在辅助线程上从文件中读取音频数据。我见过的每个代码示例的核心都是这样的循环:

(或 Swift 等价物)。我的问题是,copyNextSampleBuffer在等待来自 的数据时会阻塞AVAsset,还是NULL在数据尚不可用时返回?如果是后者,那么我们有一个轮询循环,这是不好的做法,在反复检查时会消耗 CPU 周期status。的文档copyNextSampleBuffer没有说明它是否在等待时阻塞线程。我也无法判断它是否尝试立即返回可用的任何数据,或者失败/阻塞,除非它有足够的数据用于某个最小大小的缓冲区。