问题标签 [video-toolbox]

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 回答
65 浏览

swift - 使用 VTCompressionSessionEncodeFrame 时如何在没有更多上下文的情况下修复“OSStatus”不明确

我一直在尝试使用VTCompressionSessionEncodeFrame对一些 CMSampleBuffers 进行编码,但是当我尝试使用它时,我总是会收到此错误:Expression type 'OSStatus' (aka 'Int32') is ambiguous without more context

我试图找出它是什么但没有成功,这是我正在使用的代码:

var compressed = VTCompressionSessionEncodeFrame(session: vtCompressionSession, imageBuffer: imageBuff!, presentationTimeStamp: nil, duration: CMTime.invalid, frameProperties: nil, infoFlagsOut: infoFlags)

我也没有在代码的其他任何地方引用压缩变量。

感谢所有帮助。

0 投票
0 回答
34 浏览

swift - 实例成员 x 不能用于类型 y

我一直在尝试进行压缩回调,将压缩数据发送到进程的不同部分,但是当我放行发送数据时,我得到了这个错误

实例成员“ptManager”不能用于“SampleHandler”类型

这是回调的代码:

我已经查看了其他解决方案,但没有发现任何有效的方法,因为如果我设置ptManager为静态,它会导致比它解决的问题更多的问题,并且删除=.

对此的所有帮助将不胜感激!

编辑

这是我尝试过的一些早期代码,它们可能有效,但在我将其分配给回调时从未被调用:

编辑2:

这是使用回调的地方:

0 投票
2 回答
231 浏览

ios - VideoToolBox中是否可以控制RGB到YUV矩阵的转换?

我发现不同的Iphone硬件编码器有不同的矩阵用于将输入RGB转换为YUV。即在函数​​OSStatus VTCompressionSessionEncodeFrame(VTCompressionSessionRef session, CVImageBufferRef imageBuffer, CMTimepresentationTimeStamp, CMTime duration, CFDictionaryRef frameProperties, void *sourceFrameRefcon, VTEncodeInfoFlags *infoFlagsOut); imageBuffer格式是RGB。在编码之前,VideoToolBox会将RGB转换为YUV并发送给编码器。我想知道VideoToolBox用什么样的矩阵来进行RGB到YUV的转换,以及如何控制转换矩阵的选择。硬件编码器VideoToolbox的输入参数中,只有kVTCompressionPropertyKey_YCbCrMatrix与颜色转换有关。但该参数不控制输入RGB到YUV矩阵。因为我尝试输入不同的值,结果没有改变。这导致解码时无法匹配矩阵,导致色差。我在网上搜索了很长时间。但是没有用。请帮助或尝试提供一些想法如何实现这一目标。

0 投票
3 回答
6022 浏览

macos - 在 OSX 上优化使用 hevc_videotoolbox 和 ffmpeg

我正在使用 ffmpeg 4.3.1 将视频从 h264 转换为 h265,最初我很高兴地发现我可以使用我的 Mac 的 GPU 来加速带有 hevc_videotoolbox 标志的转换。

我的 Mac 硬件是带有 AMD Radeon Pro 5300 的第 10 代 Intel i5

我正在使用这个命令:

转换速度从 0.75 倍提高到 4 倍,几乎提高了 500%!

但后来我注意到大文件大小和稍微模糊的结果。然后我注意到更改 crf 或预设没有任何区别,ffmpeg 似乎忽略了这些设置。唯一可行的设置是视频比特率 (-b:v)。

所以我开始用谷歌搜索,看看我怎样才能得到更好的结果。

但除了这里和那里的一些帖子外,我大部分时间都是空白的。

我在哪里可以获得有关如何使用 hevc_videotoolbox 获得更好结果的文档?如何找出哪些设置有效,哪些设置被忽略?

0 投票
0 回答
245 浏览

swift - 在 Swift 中使用 FFmpeg 和 VideoToolbox 从 H.264 RTSP-Stream 获取 NALU

我对视频处理非常陌生,现在我在 Swift 中使用 FFmpeg 和 VideoToolbox 解码我的 H.264 RTSP-Stream。

目前我在提取 sps 和 pps 时有点不知所措

-> 它们存储在哪里?我有以下选项获取数据

.. 等等

现在我正在使用AVCodecContext.extra_data,但这似乎与此处的示例有点不同

我获取 SPS 和 PPS 的代码是这个

获取 naluType 的进一步函数:

使用此自定义枚举器:

正如你在receiveRawFrame函数的注释中看到的那样,我从来没有得到第三个 NALU。当我打印AVCodecContext.extraDatafrom [0]to[50]我得到以下输出

0 0 0 1 103 66 192 30 217 3 197 104 64 0 0 3 0 64 0 0 12 3 197 139 146 0 0 0 1 104 203 140 178 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

现在有道理了,我从来没有得到第三个 NALU,因为只有 2 个 StartCode,但其余的在哪里?

0 投票
1 回答
155 浏览

ios - NVIDIA NVENC(媒体基金会)编码的 h.264 帧未使用 VideoToolbox 正确解码

尝试在 iPad Pro OS v14.3 上解码帧时,我遇到了与此处描述的相同的问题(我也在使用Olivia Stork 的示例):

25%的图片数据被正确解码,剩下的图片只是绿色。

iPad Pro OS v14.3 上的解码图像如下所示(图像被转换并保存在解码器回调中,如此所述,因此不仅仅是显示问题)。

原始图像看起来像这样

图像在 Windows10 上使用 NVIDIA NVENC (Media Foundation) 进行编码。

如链接中所述,我在帧图片数据中搜索了额外的 4 字节 NALU 起始代码,但对于 SPS、PPS 和 IDR 图片数据,只有三个预期的。

我在 Windows10 上运行了另一个 Media Foundation 解码器应用程序,它可以正确解码来自完全相同源的帧。

我现在正在努力寻找问题的原因..有人有什么想法吗?

提前致谢。抢

- 编辑 2021-01-11

我发现在 NALU 类型 5 的 IDR 图片数据块中实际上还有三个额外的 3 字节起始码(0x000001)。

我试图用以下数据块的长度(大端)替换这些起始代码,如此处所述但结果相同。

我还尝试按照此处所述添加仿真预防字节(0x000001 => 0x000301),但这也没有什么区别。

也许我被误导了,这些起始代码与问题无关..至少它们不仅仅是随机图像数据,因为它们总是出现在图片数据块中的相同位置(索引)。目前我的想法已经不多了..有人提示吗?

- 编辑 2021-01-14

我想出了更多的东西:

出于完全缺乏想法,我复制了块开头最后一个起始码之后的图片数据(紧跟在 4 字节 NALU 起始码之后)。我曾期望——如果这能奏效的话——在解码图像的顶部看到原始图像的最后四分之一,但令我惊讶的是,解码图像看起来像这样

我对第二个和第三个起始码之后的图片数据进行了同样的尝试,解码后的图像看起来像这样图像数据被正确解码,甚至在正确的位置(与原始图像相比)。

即使我剥离所有 3 字节起始码并复制 4 字节起始码后连接的图片数据,结果也是一样的,只有 25% 的图像被解码。所以额外的 3 字节起始码显然不是问题。必须有一些设置告诉解码器只解码图像的 25%。我会提示 CMVideoFormatDescription,但据我所知,它看起来还不错。

我也想知道解码器如何知道在哪里显示不同的图片数据块。要么在图片数据中的某处定义了偏移量,要么编码器以某种方式添加了每个像素的 xy 位置。

0 投票
1 回答
125 浏览

macos - 使用 Apple Video Toolkit 进行 H264 解码

我正在尝试使用 Apple Video Toolbox 和 OpenH264 的组合让 H264 流媒体应用程序在各种平台上运行。有一个用例不起作用,我找不到任何解决方案。当源在运行 MacOS High Sierra 的 2011 iMac 上使用视频工具箱并且接收器是运行 Big Sur 的 MacBook Pro 时。

在接收器上,解码后的图像大约是 3/4 绿色。如果我在编码之前将图像缩小到原始图像的 1/8 左右,那么它可以正常工作。如果我在 MacBook 上捕获帧,然后在 iMac 上的测试程序中运行完全相同的解码软件,那么它可以很好地解码。在 Macbook 上做同样的事情(测试程序的相同图像)再次给出 3/4 绿色。在较慢的 Windows 机器上从 OpenH264 编码器接收时,我遇到了类似的问题。我怀疑这与时间处理有关,但对 H264 的理解还不够好,无法解决。我确实注意到的一件事是,解码调用在大约 70% 的时间返回时没有错误代码,而是返回 NULL 像素缓冲区。

解码部分的“胆量”是这样的(改编自GitHub上的demo)

注意:NAL 块没有 00 00 00 01 分隔符,因为它们在具有显式长度字段的块中流式传输。

解码在所有平台上都可以正常工作,并且编码流使用 OpenH264 可以很好地解码。

0 投票
1 回答
254 浏览

ios14 - 设备上 iOS14 的 VideoToolbox HEVC 解码失败

因此,虽然我确定我不会为任何人提供足够的信息来修复我的特定代码,但我很想知道的是:

有谁知道 iOS14 可能发生了什么来改变 HEVC 解码要求?


我有一个使用 VideoToolbox 为来自网络的 HEVC 编码视频流构建的解码器,它在 iOS 13 设备iOS 14 模拟器上运行良好。但它在 iOS 设备上的 iOS 14(撰写本文时最高 14.4)中大部分时间都失败了。“大多数时候”,因为有时它确实有效,具体取决于我尝试开始解码的流中的哪个位置。

我偶尔会从我的解压输出回调记录中得到一个错误是 OSStatus -12909kVTVideoDecoderBadDataErr。到目前为止,如此无益。

或者我可能不会得到任何错误输出,例如在一个单元测试中,它接收固定的数据包并且应该始终生成视频帧。(在设备上使用 iOS14 时,此测试同样无法生成预期的帧。)

其他人对 iOS 14 中的 HEVC 解码有任何问题吗?我实际上是在这里寻找线索...我尝试为VTDecompressionSessionDecodeFrame()( ._EnableAsynchronousDecompression, ._EnableTemporalProcessing, ...)切换所有常用的输入标志

我还尝试重做整个渲染层以AVSampleBufferDisplayLayer与 raw一起使用CMSampleBuffers。完美解码!!但我不能使用它……因为我需要自己对输出帧的时间进行微观管理(而且它们并不总是按顺序排列的)。



(如果有帮助,我在单元测试中放入的固定输入数据包按顺序包括以下类型的 NALU :NAL_UNIT_VPSNAL_UNIT_SPSNAL_UNIT_PPSNAL_UNIT_PREFIX_SEINAL_UNIT_CODED_SLICE_CRA最后NAL_UNIT_CODED_SLICE_TRAIL_NNAL_UNIT_CODED_SLICE_TRAIL_R服务器作为基本的健全性测试。)

0 投票
0 回答
99 浏览

ffmpeg - FFmpeg/GStreamer - 从 HEVC (H.265) 基本流中提取 alpha 通道

我已经生成了一个 HEVC (H.265) 基本流,其中包含 alpha(由 Apple VideoToolbox 框架生成),我想从中提取 alpha 通道以进行进一步处理。

我想以以下两种方式之一处理 alpha:-

(a) 一系列灰度 PNG/JPEG 图像,每帧的 alpha 通道

或者

(b) 一系列带有 alpha 的 PNG,其中 RGB 和 Alpha 合成在一个单一的半透明图像中

如何使用 FFmpeg/GStreamer 实现其中任何一个?

0 投票
0 回答
150 浏览

ios - iOS - 如果分辨率超过 1080p,则无法解码 HEVC (H.265) 流

我正在使用 Apple 的 VideoToolbox API 来解码 HEVC 流。我正在使用AVSampleBufferDisplayLayer图层来渲染解码帧。

如果源分辨率为 1080p (1920 X 1080) 或更低,我可以成功解码帧。

如果分辨率高于 1080p,我会看到黑屏和以下错误消息AVSampleBufferDisplayLayerFailedToDecodeNotification

Optional(Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode" UserInfo={AVErrorMediaSubTypeKey=( 1752589105 ), NSLocalizedDescription=Cannot Decode, NSLocalizedFailureReason=媒体数据无法解码。可能已损坏。, AVErrorMediaTypeKey=vide, AVErrorPresentationTimeStampKey= CMTime: {INVALID}, NSUnderlyingError=0x2830c3390 {错误域=NSOSStatusErrorDomain 代码=-12909 "(null)"}})

-11821 = AVErrorDecodeFailed -12909 =kVTVideoDecoderBadDataErr

我是否缺少任何更高分辨率的东西?我是否需要设置正确的 HEVC 级别、配置文件或层级?我不知道该怎么办。

我会很感激你的意见。谢谢!