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

ios - Swift 中的 CMVideoFormatDescriptionCreateFromH264ParameterSets

CoreMedia/Video Toolbox API 使用了很多在 Swift 中让我感到困惑的指针!

SPS、PPS 数据来自我的 h264 流,我只是想为它创建一个 VFD。

我已经尝试了以下方法并希望它能够工作,但我收到了 -12710 错误(kCMFormatDescriptionError_InvalidParameter = -12710)。

这是我的游乐场..我做错了什么??

0 投票
0 回答
306 浏览

objective-c - 视频播放防止镜像解决方法

环境

  • Xcode @ OS-X 优胜美地
  • iOS App @ Obj-C

用例

  • 在 iOS 和 OSX 之间设置了 Quicktime 镜像会话(如何在 iOS 8 和 Yosemite 之间设置镜像会话?
  • 第三方 SDK 与 iOS 应用程序集成
  • SDK用于视频播放
  • 当视频正在播放并设置了镜像会话(作为外部显示器)时,没有视频正在播放(只有音频)
  • SDK没有任何API来控制外部视频播放/镜像在镜像时的开/关

我需要能够将视频镜像到我的 OSX 桌面,为此,我尝试通过以下方式从 3rd 方 SDK 隐藏镜像屏幕(但这没有帮助):

如何绕过视频播放镜像保护?我应该拦截任何较低级别的 API 吗?

0 投票
1 回答
3511 浏览

ios - VTCompressionSessionEncodeFrame 错误代码 -12902

我有一个函数,它接受一个 CVImageBufferRef 并将其传递给我的 VTCompressionSession 进行处理。

VTCompressionSession 已启动,我对 VTCompressionSessionCreate 的调用成功。

我正在从照片库中检索视频 URL 并使用以下内容对其进行处理:

该块基本上只是调用

状态为-12902。我在此站点上查看了有关状态的信息,但找不到任何其他相关信息。该网站说错误是kVTParameterErr.

我的 VTCompressionOutputCallback 没有被调用。

谁能向我解释这个错误代码?

0 投票
3 回答
2992 浏览

ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率

我正在使用 AVSampleBufferDisplayLayer 来显示通过网络连接以 h.264 格式出现的 CMSampleBuffers。视频播放流畅且工作正常,但我似乎无法控制帧速率。具体来说,如果我在 AVSampleBufferDisplayLayer 中以每秒 60 帧的速度排队,它会显示这 60 帧,即使视频是以 30 FPS 的速度录制的。

创建样本缓冲区时,可以通过将时间信息数组传递给 CMSampleBufferCreate 来设置演示时间戳(时间信息不存在于 h.264 流中,但可以计算或以容器格式传递)。我设置的演示时间戳相隔大约 0.033 秒,持续时间为 0.033,但显示层仍然每秒显示尽可能多的帧。

有两种方法可以在 AVSampleBufferDisplayLayer 上对缓冲区进行排队:每当缓冲区准备好时通过调用 -[AVSampleBufferDisplayLayer enqueueSampleBuffer:] 来“约束”,或者通过调用 -[AVSampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:usingBlock:] 并将缓冲区排队在该块中的“不受约束”。我已经尝试了这两种方法,但即使是第二种方法也尽可能快地显示缓冲区 - 例如,如果我在接收端排队了 300 帧,那么第一次执行上述方法中的块时,无论有多少,readyForMoreMediaData 都保持为真缓冲区被排入队列,并且它们都在很短的时间内显示出来。

如果在 CMSampleBuffer 上设置了 kCMSampleAttachmentKey_DisplayImmediately 附件,则此行为类似于人们所期望的,但是当前未设置(默认值为 false)。

我尝试设置图层 controlTimeBase,但似乎没有任何效果。我不知道要尝试的其他事情,也无法在网上找到示例。有谁知道如何控制 AVSampleBufferDisplayLayer 显示帧的帧速率?

0 投票
1 回答
913 浏览

video-streaming - 如何在没有 VideoToolbox 的情况下访问 tvOS 上的硬件解码?

由于 VideoToolbox 不适用于 tvOS,我如何解码视频?

我有一个应用程序,我在内存中有 h.264 帧(通过网络传输),我之前正在使用 VideoToolbox 处理解码。什么是替代品?

0 投票
2 回答
3230 浏览

ios - 在 iOS 上显示 CVImageBufferRef 的最有效方法是什么

我有 CMSampleBufferRef(s),我使用 VTDecompressionSessionDecodeFrame 解码,这会在帧解码完成后产生 CVImageBufferRef,所以我的问题是..

在 UIView 中显示这些 CVImageBufferRefs 的最有效方法是什么?

我已成功将 CVImageBufferRef 转换为 CGImageRef 并通过将 CGImageRef 设置为 CALayer 的内容来显示它们,但随后 DecompressionSession 已配置为 @{ (id)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] };

这是我如何将 CVImageBufferRef 转换为 CGImageRef 的示例/代码(注意:cvpixelbuffer 数据必须采用 32BGRA 格式才能正常工作)

#WWDC14 会话 513 ( https://developer.apple.com/videos/wwdc/2014/#513 ) 暗示可以避免 YUV -> RGB 颜色空间转换(使用 CPU?),并且如果使用支持 YUV 的 GLES 魔法 -想知道这可能是什么以及如何实现?

Apple 的 iOS SampleCode GLCameraRipple 显示了一个示例,该示例显示使用 2 个 OpenGLES 从相机捕获的 YUV CVPixelBufferRef,Y 和 UV 组件具有单独的纹理,以及使用 GPU 执行 YUV 到 RGB 颜色空间转换计算的片段着色器程序 - 是真正需要的,或者是有一些更直接的方法可以做到这一点吗?

注意:在我的用例中,我无法使用 AVSampleBufferDisplayLayer,因为事实上解压缩的输入是可用的。

0 投票
1 回答
683 浏览

ios - 从 MPEG 传输流中提取 H.264 NAL 单元?

如何在 iOS 平台上从 MPEG 传输流中提取 H.264 NAL 单元?VideoToolbox 或 AVFoundation 中有什么可以帮助我的吗?我必须自己解析流吗?

0 投票
3 回答
2712 浏览

ios - 带有 VTDecompressionSession 的图像缓冲区显示顺序

我有一个项目,我需要从实时网络流中解码 h264 视频,最终得到可以在 iOS 设备上的另一个框架 (Unity3D) 中显示的纹理。我可以使用 VTDecompressionSession 成功解码视频,然后使用 CVMetalTextureCacheCreateTextureFromImage(或 OpenGL 变体)获取纹理。当我使用低延迟编码器并且图像缓冲区按显示顺序出现时效果很好,但是,当我使用常规编码器时,图像缓冲区不会按显示顺序出现并且重新排序图像缓冲区显然要困难得多我期望。

第一次尝试是使用 kVTDecodeFrame_EnableAsynchronousDecompression 和 kVTDecodeFrame_EnableTemporalProcessing 设置 VTDecodeFrameFlags ......但是,事实证明 VTDecompressionSession 可以选择忽略该标志并做任何想做的事情......在我的情况下,它选择忽略该标志并仍然输出编码器顺序的缓冲区(不是显示顺序)。基本没用。

下一个尝试是将图像缓冲区与演示时间戳相关联,然后将它们放入一个向量中,这样我就可以在创建纹理时获取所需的图像缓冲区。问题似乎是进入与时间戳相关联的 VTDecompressionSession 的图像缓冲区不再是出来的同一个缓冲区,基本上使时间戳无用。

例如,进入解码器......

在回调方面...

排序后,回调端的时间戳以预期的速率单调增加,但缓冲区的顺序不正确。有谁看到我在这里犯了错误?或者知道如何确定回调端缓冲区的顺序?在这一点上,我已经尝试了几乎所有我能想到的。

0 投票
2 回答
2314 浏览

macos - How to debug why Mac OS is not using Hardware H264 encoder

I'm trying to encode some video only stream using H264, and I'm willing to use the hardware encoder in order to compare both quality and resource consumption between hardware and CPU encoding. The thing is that I'm not being able to force the OS to use the hardware encoder.

This is the code I'm using to create the VTCompressionSession:

I opened the Console and this the only relevant message I'm getting when I try to create the session:

This is the status code I get when I use the EncoderID:

And this is the one I get when I don't use the EncoderID:

Both relate to the lack of availability of the resource, but couldn't find any difference. I've checked that the most known functionality that may use the hardware encoder are turned off, but I don't know how to check this for sure. AirPlay is off, QuickTime is off, there's not any app accessing the camera, and so.

TL;DR: is there any way to force or to know what's the strategy the OS is using to enable the Hardware Encoder, and eventually know why it is not available at any moment?

Thanks in advance!

0 投票
0 回答
820 浏览

ios - 如何在 VTCompressionSessionEncodeFrame 之后从 H.264 AVC CMBlockBufferRef 中提取运动矢量

我正在尝试阅读或理解1/30 帧CMBlockBufferRef的表示。H.264 AVC

缓冲区和封装CMSampleBufferRef是通过使用创建的VTCompressionSessionRef
https://gist.github.com/petershine/de5e3d8487f4cfca0a1d

H.264 数据表示为CMBlockBufferRef来自压缩样本的 AVC 内存缓冲区。

在没有完全解压的情况下,我试图从中motion vectors or predictions提取CMBlockBufferRef
我相信,为了获得最快的性能,应该有必要从数据缓冲区中逐字节读取。CMBlockBufferGetDataPointer()

但是,我很难找到读取数据缓冲区的正确方法,目的是查找和提取motion vectors or predictions.

没有解压缩或使用没有办法ffmpeg吗?