问题标签 [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 回答
247 浏览

ios - UIImage Size 属性返回像素尺寸而不是点

我从相机输出中获取 CVImageBufferRef ,然后使用 VideoToolbox 将其转换为CGImageRef然后其转换为UIImage

奇怪的是....当我检查UIImage的大小时,它打印的是像素宽度而不是点宽度。

又名...CGImageGetWidth(image) == imageToCrop.size.width

显然这是不正确的,因为UIImage的大小应该以磅为单位。

https://developer.apple.com/documentation/uikit/uiimage/1624105-size?language=objc

图像的逻辑尺寸,以点为单位。

运行 iOS 11.1

2017-11-02 16:16:00.895449-0400 TestBed[3950:1202023] image.width = 1080

2017-11-02 16:16:00.895515-0400 TestBed[3950:1202023] photoToCrop.size.width = 1080.000000

2017-11-02 16:16:00.895558-0400 TestBed[3950:1202023] photoToCrop.scale = 1.000000

2017-11-02 16:16:00.895663-0400 TestBed[3950:1202023] 底层 CGimageRef,宽度 = 1080

0 投票
0 回答
163 浏览

ios - 使用 CIImage 或 CGImage 作为直接输入 videotoolbox

我正在尝试制作一个功能,从相机应用过滤器帧捕获并通过网络流式传输。

由于在 CMSampleBuffer 或 CVPixelBuffer(CPU 端)中应用过滤器时性能不佳,我尝试将数据从 CMSampleBuffer(来自相机捕获的原始数据)转换为 CIImage(CPU 端),然后使用 Core Image 的一些内置过滤器。当我转换回 CVPixelByteBuffer(或 CMSampleBuffer)以使用 VideoToolbox 进行编码时,以流畅的 fps 实现实时目标太慢了(我来宾的原因是将数据从 GPU 传输到 CPU)。

那么,有没有办法使用 CIImage 或 GL 纹理(如将纹理绘制到表面作为 MediaCodec 输入)作为 VideoToobox 的输入?或者更快地从 CGImage/CIImage 转换为 CVSampleBuffer,或者使用着色语言?我认为这是可能的,因为 Messenger、Snapchat、Snow ……可以在 iPhone 5 等旧设备上表现良好)

谢谢大家。

0 投票
1 回答
1284 浏览

objective-c - 使用Videotoolbox进行H264编码和解码

我正在使用 videotoolbox 测试编码和解码,将捕获的帧转换为 H264 并使用该数据在 AVSampleBufferdisplayLayer 中显示它。

解压 CMVideoFormatDescriptionCreateFromH264ParameterSets 时出现错误,错误代码为 -12712

我遵循来自 mobisoftinfotech.com 的这段代码

视频压缩测试;谁能找出问题所在?

0 投票
0 回答
368 浏览

ios - AVAssetReader,调用方法“startReading”失败,返回NO,Error Domain=AVFoundationErrorDomain Code=-11841 (AVErrorInvalidVideoComposition)

我逐帧阅读 MP4 视频,所以我使用 AVAssetReader ,它总是可以正常工作,但在“startReading”方法中失败的概率为 1/100。错误域=AVFoundationErrorDomain 代码=-11841 (AVErrorInvalidVideoComposition) - (void)test{

}

0 投票
1 回答
865 浏览

ios - -12909 error decoding h264 stream with intra-refresh

I'm making an iOS app that decodes an h264 stream using video-toolbox. I create the stream with ffmpeg on a PC and send it to an iPhone using RTP. It's working nicely when I use this command to create it:

The iPhone receives and displays all the frames. However, when I enable intra-refresh

decoding fails with error code -12909 (-8969 on simulator) when VTDecompressionSessionDecodeFrame() is called.

I take care of processing UDP packets to extract NAL Units, so I triple checked this process and discarded a problem with this part of the code.

I didn't find any info about Video-toolbox not supporting intra-refresh, so the question is, does Video-toolbox support intra-refresh? and if it does, am I missing something in the ffmpeg side that makes the stream not supported by Video-toolbox? Do I have to add something to the CMVideoFormatDescriptionRef apart from creating it with SPS and PPS data using CMVideoFormatDescriptionCreateFromH264ParameterSets()?

0 投票
0 回答
509 浏览

macos - macOS VTCompressionSession:如何控制 JPEG 色度二次采样模式?(YUV 4:2:0)

对于我们当前的项目,我们已经生成了一系列图像帧,经过一些处理,我们需要使用一些编解码器实时压缩并通过网络发送。第一个实现需要使用 JPEG,尽管稍后将添加其他更专注于视频的编码。

我们一直在使用 Apple 的 VideoToolbox.framework 进行压缩,因为它的 JPEG 编码器kCMVideoCodecType_JPEG( . (它似乎没有硬件加速 JPEG,FWIW。)

这一切都很好,除了输出帧上的一些典型的 JPEG 振铃伪影。理论上这没有问题,有一个kVTCompressionPropertyKey_Quality属性。不幸的是,调整这个值似乎隐含地改变了色度子采样模式—— 0.75向上似乎将编码器从 YUV 4:2:0 子采样切换到 4:2:2,并且在途中的某个地方1.0再次翻转到 4:4: 4. 由于我们无法控制的原因,我们需要将帧编码为 4:2:0 JPEG,而 0.74 的质量水平非常糟糕。另外,Apple 可能会在未来的版本中更改他们的阈值,即使我们坚持使用 0.74,这也会突然破坏我们的代码。

有没有办法手动选择 aVTCompressionSession使用的色度二次采样模式?

已经尝试过:我们的源帧数据以 BRGA 形式出现,这就是我们一直用于源CVPixelBuffer对象的像素格式。一种想法是自己进行色彩空间转换,并提供kCVPixelFormatType_420YpCbCr8BiPlanarFullRange像素格式的像素缓冲区。压缩会话肯定不会将其上采样到 422 或 444?事实证明确实如此。没有帮助。

还有其他建议吗?目前还不太清楚可以在压缩会话、每一帧、像素缓冲区等上设置哪些属性。 - 我已经挖掘了框架头文件,并没有发现任何明显的东西,但我错过了什么吗?或者是切换到不同 JPEG 编码器的唯一解决方案?

这是我们的压缩会话初始化代码,包括质量设置:

像素缓冲区的创建方式如下:

或者在使用 YUV420 像素缓冲区时:

每个帧编码都是通过这个调用开始的:

0 投票
0 回答
948 浏览

ios - 解码 HEVC 时 iOS VTDecompressionSessionDecodeFrame 错误 -12909

使用 VTDecompressionSessionDecodeFrame 时,我在通过 rtsp 流式传输原始 H.265 时遇到了一些问题。我做的 3 个主要步骤如下:

格式描述如下所示:

解码帧时,我在解压缩回调中得到 OSStatus -12909。因此,我认为在创建格式描述时正确处理了 VPS、PPS 和 SPS。解压会话也已成功创建。我还可以成功解码和渲染 HEVC 流,例如这个:如果将 CMVideoFormatDescriptionCreateFromHEVCParameterSets 更改为 CMVideoFormatDescriptionCreateFromH264ParameterSets,则该解决方案在流式传输原始 H.264 时也有效。

有什么想法可能是错的吗?是否支持格式描述?遗憾的是,苹果方面没有太多关于 HEVC 解码的文档。如果使用 ffmpeg,我可以流式传输我的 H.265 流,所以我猜流应该是正确格式的。

0 投票
1 回答
520 浏览

ios - AV Foundation 和 VideoToolboox 有什么区别?

何时使用 AV Foundation,何时使用 Video ToolBox?谁能解释一下吗?

0 投票
0 回答
124 浏览

ios - IOS 从 NSData 到 NALU 和视频缓冲区

我想开始开发一个低级的视频播放器,在这个阶段,我能够从服务器缓存它们下载视频,用 AVPlayer 播放它们。我想要做的是删除 AVPlayer,用低级 API(AVFoundation、CoreMedia、VideoToolbox ...)替换它我坚持从 NSData 获取 NALU。谁能指出我有用的东西?.

0 投票
0 回答
393 浏览

swift - 硬编码 PPS 和 SPS 参数时,无法使用 VideoToolbox 解压缩 H.264 帧

我写了一个很好用的 H.264 解码器。但是出于性能原因,我正在尝试对 PPS 和 SPS 参数进行硬编码(它们永远不会改变)。

作为参考,这是它们以 10 [UInt8] 为底的样子:

  • SPS [103, 66, 0, 40, 244, 5, 1, 236, 128]
  • PPS [104、206、9、136]

奇怪的是,当我从接收到的帧中解码 PPS 和 SPS 参数并使用它们创建格式描述和解压缩会话时,效果很好;但是当我对它们进行硬编码时,它不起作用,并且当我尝试解压缩帧时出现 VT 错误 -12909(错误数据)。据我所知,字节数组是完全相同的。

为了对它们进行硬编码,我只是像这样编写了我的 createFormatDescription:

并在我的init()方法中调用它。除此之外,我没有做任何改变;帧以完全相同的方式被解释。

作为参考,这是我的 VT 回调的样子:

很基本。重申一下,我总是收到“VT ERROR -12909”