问题标签 [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 投票
0 回答
218 浏览

ios - 使用 GPUImage2 过滤视频流

我可以访问CVPixelBufferRef每一帧,并希望ChromaKey在渲染之前对其应用过滤器。

到目前为止,我能想到的唯一解决方案是首先将像素缓冲区转换为图像。这是我仅针对 PoC 的准系统解决方案。

获得过滤后的图像后,我将其传递给MTKView进行绘制。

所以我的具体问题是,我可以避免将像素缓冲区转换为图像并仍然GPUImage2用于过滤器吗?

0 投票
0 回答
246 浏览

macos - 如何将带有 AVAssetWriter 的 colorProfile 添加到使用 CGDisplayStream 从屏幕录制的视频中

我编写了一个屏幕录制应用程序,它使用 VideoToolbox 和 AVWriter 写出 H.264 电影文件。与原始屏幕相比,录制文件中的颜色有些暗淡。我知道这是因为 colorProfile 没有存储在视频文件中。

这与如何颜色管理 AVAssetWriter 输出密切相关

我已经创建了一个测试平台来在 github ScreenRecordTest上展示它

如果您运行此应用程序,您可以使用 CMD-R 开始录制并使用相同的 CMD-R 停止录制(您必须开始和停止录制一次才能获得完整的电影文件)。您将在 /tmp/ 文件夹中找到类似以下名称的录音:“/tmp/grab-2018-10-25 09:23:32 +0000.mov”

录制时,应用程序会显示两个实时图像:a)从 CGDisplayStream 获取的帧 -b)来自压缩器的 cmSampleBuffer。

我发现从 CGDisplayStream 返回的 IOSurface 不是颜色管理的,所以你会注意到压缩之前已经出现了“暗淡”的颜色。如果您取消注释 AppDelegate.swift 中的第 89 行

此实时预览将具有正确的颜色。现在这仅用于显示压缩前的 IOSurface。我不知道如何使其他实时预览(压缩后)(AppDelegate 中的第 69 行)显示正确的颜色(例如:如何将 colorProfile 应用于 CMSampleBuffer)或者最重要的是如何用正确的配置文件,以便在打开 .mov 文件时我在播放时获得正确的颜色。

0 投票
1 回答
5247 浏览

macos - 如何通过 ffmpeg OSX 使用 hevc/h265 编解码器对视频进行编码

我尝试使用 hevc 编解码器对视频进行编码

错误:

我尝试更改比特率,宽度,高度,错误仍然存​​在是否可以在我的 macbook air 2015 上编码视频?videotoolbox 不能使用我的旧 GPU 并且可以在最新的 macbook 上使用吗?

0 投票
1 回答
1174 浏览

ios - iOS上的H.265(HEVC)解码-可以解码帧之前的正确NALU顺序是什么

我最近在 iOS 中使用 VideoToolbox api 获得了 HEVC / H.265 解码。传入的 RTP 流来自使用 libx265 中的 x265 编解码器的 FFMPEG。

经过大量修改后,我使用传入的 VPS、SPS 和 PPS nalus 创建了我的 CMFormatDescription - 然后我等待 CRA_NUT nalu (21) 关键帧。一旦通过,我就可以解码接收到的下一波视频数据包。伟大的!

但是,我现在想接受由 Nvidia 的视频编码 SDK 编码的 RTP 流。不同之处在于,不是 CRA_NUT nalu 在序列参数之后到达 - 我现在收到 VideoToolbox 似乎不喜欢的 IDR_W_RADL (19) - 结果我从解压缩会话的回调中得到 kVTVideoDecoderBadDataErr。

由于 VideoToolbox 的文档非常稀少 - 调试起来非常困难。VideoToolBox 是否总是期望 CRA_NUT nalu 作为关键帧?或者有什么办法让它接受 IDR_W_RADL 关键帧?是否有 VideoToolbox 期望的标准序列?

相反,有没有办法配置 nvidia 视频编解码器 sdk 以返回 CRA_NUT 关键帧?我查看了 api 但找不到任何东西——我似乎总是得到 IDR_W_RADL 以及序列参数。

0 投票
0 回答
1284 浏览

android - 如何减少 Android hw 视频解码延迟?H264 720p 30ms?

我正在尝试测试是否可以使用硬件代码进行实时通信,例如 100 毫秒用于 720p 客户端到客户端延迟,40 毫秒用于系统延迟和 60 毫秒用于网络,带有 VT 的 iOS 已经可以了。当我用 AMediaCodec 尝试它时,看起来编解码器总是在第一个输出可用之前缓冲超过 8 帧。继续调用 AMediaCodec_queueInputBuffer 来输入视频帧 AMediaCodec_dequeueOutputBuffer 来处理输出。但是在输入 8 帧或更多帧之前,我不会得到任何可用的输出。改为使用 AMEDIACODEC_INFO_TRY_AGAIN_LATER。尝试了 H264 高配置和基线。当我使用 Codecvisa 检查转储的 h264 流时,我得到了大小为 8 的 DPB(解码图片缓冲区),看起来像是额外缓冲的提示?

我还在 Grafika MediaCodec 示例代码中对 MoviePlayer.java 进行了一些简单的测试。我正在关注编解码器在初始解码滞后后拥有多少个输出缓冲区,初始延迟是我可以接受的,因为它只是在开始时。我添加了一个extra_buffer_cnt,它在queueInputBuffer succuss 和- dequeueOutputBuffer 时++,并且我还添加了一个while 循环来调用dequeueOutputBuffer 以确保可以及时调用dequeueOutputBuffer。从日志中,我可以看到对于某些流,额外的缓冲区始终为 8,而对于其他流,可能为 0。

0 投票
1 回答
734 浏览

ios - VTCompressionSession 比特率/数据率过冲

一段时间以来,我一直在使用 VideoToolbox 的H264 硬件加速编码器VTCompressionSession实现工作,一个一致的问题是它的比特率不可靠。我已经阅读了许多论坛帖子并查看了现有的代码,并试图效仿,但我的编码器的比特率几乎总是在设置的 5% 到 50% 之间,有时我已经看到了一些巨大的错误,比如甚至 400% 的过冲,即使是一帧也会是给定平均比特率的两倍。

我的会话设置如下:

  • kVTCompressionPropertyKey_AverageBitRate= 所需比特率
  • kVTCompressionPropertyKey_DataRateLimits= [所需比特率 / 8, 1]; 占位与字节
  • kVTCompressionPropertyKey_ExpectedFrameRate= 帧率(30、15、5 或 1 fps)
  • kVTCompressionPropertyKey_MaxKeyFrameInterval= 1500
  • kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration= 1500 / 帧率
  • kVTCompressionPropertyKey_AllowFrameReordering= 否
  • kVTCompressionPropertyKey_ProfileLevel =kVTProfileLevel_H264_Main_AutoLevel
  • kVTCompressionPropertyKey_RealTime= 是
  • kVTCompressionPropertyKey_H264EntropyMode=kVTH264EntropyMode_CABAC
  • kVTCompressionPropertyKey_BaseLayerFrameRate= 帧率 / 2

我在整个会话期间调整平均比特率和数据率值,以尝试补偿波动性(如果它太高,我会稍微降低它们,如果太低,我会增加它们,并限制去多高和多低)。我创建会话,然后将上述配置应用为单个字典,使用VTSessionSetProperties并将帧输入其中,如下所示:

VTCompressionSessionEncodeFrame(compressionSessionRef, static_cast<CVImageBufferRef<(pixelBuffer), CMTimeMake(capturetime, 1000), kCMTimeInvalid, frameProperties, frameDetailsStruct, &encodeInfoFlags);

所以我按照 API 的要求提供时间信息。然后,我将每个帧的输出大小相加,并在一个周期性的时间段内进行划分,以确定所需的输出比特率和错误。这就是我看到显着波动的地方。

我正在寻求任何帮助来控制比特率,因为我现在不确定该怎么做。谢谢!

0 投票
0 回答
744 浏览

ffmpeg - FFMPEG h264_videotoolbox 输出很奇怪

我想使用 h264_videotoolbox 编解码器在 FFMPEG lib 中编码我的视频。我输入的图像格式是AV_PIX_FMT_YUV420P,但输出视频帧如下。
我尝试了 libx264并且一切正常
你们知道会发生什么吗?为什么要这样编码帧?

在此处输入图像描述

在此处输入图像描述

我的测试代码:
https ://github.com/BeiKeJieDeLiuLangMao/videotoolbox

分辨率
数据应与 32 对齐。

0 投票
1 回答
615 浏览

ios - 为 iOS VideoToolbox 合成不完整 H264 流的 SPS 和 PPS

我有一台 AXIS IP 摄像机 (M1054),它通过 RTSP 发送 H264/RTP 流。

不幸的是,它们根本不发送 SPS 和 PPS NALU,它们只传输(分段)编解码器切片。

我正在尝试使用VideoToolbox需要 H264 SPS 和 PPS 元组才能正确设置CMFormatDescription.

我想知道如何通过查看实际的 H264 切片来合成必要的参数集?

更新:我已经捕获了一个示例会话,其中mplayer设法通过 Wireshark 显示流。捕获文件在这里,您可以看到整个 RTSP 设置以及几秒钟的 RTP。

0 投票
1 回答
312 浏览

ios - 从 VTCompressionOutputCallback 中引用“self”

我目前正在尝试使用 VideoToolbox 对来自 的视频数据进行编码AVCaptureVideoDataOutput,但在selfVTCompressionOutputCallback.

我的代码如下:

效果很好,并且打印输出符合预期,但是一旦我尝试在self中添加对 的引用VTCompressionOutputCallback,它就会得到一个编译器错误说明

A C function pointer cannot be formed from a closure that captures context

如何self在回调中使用?

在此先感谢您的帮助。

0 投票
0 回答
312 浏览

macos - kVTCompressionPropertyKey_DataRateLimits 属性不受硬件编码器的尊重,macOS

我正在使用 VideoToolbox 开发一个使用硬件加速进行视频编码的 macOS 项目。我曾尝试使用kVTCompressionPropertyKey_AverageBitRate和控制比特率kVTCompressionPropertyKey_DataRateLimits,但经过多次尝试后,它仍然经常超过目标比特率。

kVTCompressionPropertyKey_DataRateLimits在 macOS 上受到尊重吗?

当我使用VTSessionCopySupportedPropertyDictionary在我的压缩会话上获取支持的属性时,DataRateLimits 会显示在字典中,并且我已在压缩会话上设置它而没有错误。但是,如果我尝试实际使用它来获得它的价值

DataRateLimits在哪里key,从字典中获取,它返回属性不受支持的错误。但在 iOS 上,它成功返回

这似乎很严重,并且似乎不限于我的机器。如果它真的不受支持,那将有助于解释我的编码比特率的波动性。但是,在从事这个项目和研究 VideoToolbox 的几个月中,我没有看到任何关于 macOS 上的硬件编码器不支持此功能的情况。我认为这样的缺陷将是一个大问题。有人对此有任何见解吗?谢谢!

更新:8/5 注意:目标 SDK 是最新的(macOS-10.14.x、iOS-12.x)。我在具有不同版本 macOS (10.11-10.14) 的多个硬件型号上看到了这个问题,尽管所有型号都是 MacBook Pro,可以追溯到 2013/2014 年,以及最近的触控型号 2017/2018 年。对于 iOS,我没有很多数据,但我看到 DataRateLimits 在 12.3.1 以及 iPhone 7 和 iPhone X 上按预期显示。底线,操作系统版本和硬件似乎无关紧要;它适用于手机,但不适用于笔记本电脑。