- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 BlackMagic DeckLink SDK 尝试从 BM 设备捕获帧。
我正在尝试从 DeckLinkController::VideoInputFrameArrived
回调中的 IDeckLinkVideoInputFrame
获取像素数据,并将其转换为 CVPixelBufferRef
以能够使用 AVFoundation 的 AVAssetWriterInputPixelBufferAdaptor
和 AVAssetWriter
将其写入磁盘。除了写入磁盘的所有帧都是绿色这一事实之外,我正在使用的代码似乎正在工作。 (BlackMagic 在屏幕上生成预览的示例代码确实显示了图像,因此设备和设备设置应该没问题)。
AVAssetWriter
设置如下:
writer = [[AVAssetWriter assetWriterWithURL:destinationUrl
fileType:AVFileTypeAppleM4V
error:&error] retain];
if(error)
NSLog(@"ERROR: %@", [error localizedDescription]);
NSMutableDictionary * outputSettings = [[NSMutableDictionary alloc] init];
[outputSettings setObject: AVVideoCodecH264
forKey: AVVideoCodecKey];
[outputSettings setObject: [NSNumber numberWithInt:1920]
forKey: AVVideoWidthKey];
[outputSettings setObject: [NSNumber numberWithInt:1080]
forKey: AVVideoHeightKey];
NSMutableDictionary * compressionProperties = [[NSMutableDictionary alloc] init];
[compressionProperties setObject: [NSNumber numberWithInt: 1000000]
forKey: AVVideoAverageBitRateKey];
[compressionProperties setObject: [NSNumber numberWithInt: 16]
forKey: AVVideoMaxKeyFrameIntervalKey];
[compressionProperties setObject: AVVideoProfileLevelH264Main31
forKey: AVVideoProfileLevelKey];
[outputSettings setObject: compressionProperties
forKey: AVVideoCompressionPropertiesKey];
writerVideoInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:outputSettings] retain];
NSMutableDictionary * pixBufSettings = [[NSMutableDictionary alloc] init];
[pixBufSettings setObject: [NSNumber numberWithInt: kCVPixelFormatType_422YpCbCr8_yuvs]
forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey];
[pixBufSettings setObject: [NSNumber numberWithInt: 1920]
forKey: (NSString *) kCVPixelBufferWidthKey];
[pixBufSettings setObject: [NSNumber numberWithInt: 1080]
forKey: (NSString *) kCVPixelBufferHeightKey];
writerVideoInput.expectsMediaDataInRealTime = YES;
writer.shouldOptimizeForNetworkUse = NO;
adaptor = [[AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerVideoInput
sourcePixelBufferAttributes:pixBufSettings] retain];
[writer addInput:writerVideoInput];
作为引用,这些输出设置和压缩选项应该是正确的,但我尝试了几种不同的替代方案。
当帧从设备传入时,我将其转换为 CVPixelBufferRef
,如下所示:
void *videoData;
int64_t frameTime;
int64_t frameDuration;
videoFrame->GetBytes(&videoData);
videoFrame->GetStreamTime(&frameTime, &frameDuration, 3000);
CMTime presentationTime = CMTimeMake(frameDuration, 3000);
CVPixelBufferRef buffer = NULL;
CVPixelBufferPoolCreatePixelBuffer(NULL, adaptor.pixelBufferPool, &buffer);
CVPixelBufferLockBaseAddress(buffer, 0);
void *rasterData = CVPixelBufferGetBaseAddress(buffer);
memcpy(rasterData, videoData, (videoFrame->GetRowBytes()*videoFrame->GetHeight()));
CVPixelBufferUnlockBaseAddress(buffer, 0);
if (buffer)
{
if(![adaptor appendPixelBuffer:buffer withPresentationTime:presentationTime]) {
NSLog(@"ERROR appending pixelbuffer: %@", writer.error);
[writerVideoInput markAsFinished];
if(![writer finishWriting])
NSLog(@"ERROR finishing writing: %@", [writer.error localizedDescription]);
}
else {
NSLog(@"SUCCESS");
if(buffer)
CVPixelBufferRelease(buffer);
}
}
此代码将帧附加到 AVAssetWriterInputPixelBufferAdaptor,但所有帧都是绿色的。
有人能看出我在这里做错了什么吗?或者有人有使用 AVFoundation 使用 BlackMagic Decklink SDK 捕获和压缩帧的经验吗?
最佳答案
当您看到“绿色”并且在 YUV 颜色空间中工作时,您会在缓冲区中看到 0 值。由于 AVWriter 正在写入帧,因此“缓冲区”包含值 0 的可能性很大。我发现有几种可能发生的情况。
1) 您要附加的缓冲区很可能初始化为 0,因此您的副本可能会失败。在您的代码中,如果 (videoFrame->GetRowBytes()*videoFrame->GetHeight()) 以某种方式计算为 0,则可能会发生这种情况。这似乎不可能,但我会检查一下。
2) CVPixelBufferGetBaseAddress 返回错误的指针,PixelBuffer 本身格式错误或可能无效(但由于 API 中的保护措施而没有崩溃)。
3) 无论出于何种原因,'videoData' 本身都充满 0。当 DeckLinkCaptureDelegate 不喜欢输入格式时,它会返回其中没有任何内容的帧(通常这是因为传递给 EnableVideoInput 的 BMDDisplayMode 与您的不匹配)视频来源。
int flags=videoFrame->GetFlags();
if (flags & bmdFrameHasNoInputSource)
{
//our input format doesn't match the source
}
除了更改源模式并重试之外,快速检查是将 memcpy 行更改为以下内容:
memset(rasterData, 0x3f, 1920*1080*2);
如果您仍然看到绿框,请仔细查看#2。如果您看到不同颜色的帧,那么您的问题是 #1 或 #3,并且很可能您的视频输入的分辨率与您选择的 BMDDisplayMode 不匹配。
还有一件事需要注意。我认为您创建演示时间的行是错误的。可能应该是(注意将frameDuration更改为frameTime:
CMTime presentationTime = CMTimeMake(frameTime, 3000);
关于objective-c - 从 IDeckLinkVideoInputFrame 创建 CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892259/
我想从图像创建视频。 所以,我是引用链接的来源。 链接:CVPixelBufferPool Error ( kCVReturnInvalidArgument/-6661) func writeAnim
如何将 CVPixelBufferRef 转换为 NSImage 或 CGImageRef?我需要能够在核心动画层中显示像素缓冲区的内容。 最佳答案 要将缓冲区转换为图像,您需要首先将缓冲区转换为 C
我正在使用 GPUImage 库函数来操作 CVPixelbuffer 的高度和宽度。我正在录制纵向视频,当用户旋转设备时,我的屏幕会自动调整为横向模式。我希望横向框架适合屏幕。 例如:- 我以 32
我使用的 API 只提供纹理对象的整数 ID,我需要将该纹理的数据传递给 AVAssetWriter 以创建视频。 我知道如何从像素缓冲区 (CVPixelBufferRef) 创建 CVOpenGL
我正在做一个项目,在这个项目中我从 UIImage 生成一个视频,代码是我在这里找到的,我现在正在努力优化它几天(对于大约 300 张图像,它需要大约 5 分钟模拟器,并且由于内存而在设备上崩溃)。
我正在使用 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 录制视频和音频,并在 captureOutput:didOutputSampleBu
我正在使用 AVComposition 编写一些视频处理代码。仅提供必要的背景详细信息,我从我无法控制的苹果 API 收到一个 CVPixelBuffer。这个 CVPixel 缓冲区包含一个先前渲染
我正在尝试根据用户的输入裁剪和缩放 CMSampleBufferRef,在 ratio 上,下面的代码采用 CMSampleBufferRef,将其转换为 CVImageBufferRef 并使用 C
我正在使用 glReadPixels 将数据读入 CVPixelBufferRef。我使用 CVPixelBufferRef 作为 AVAssetWriter 的输入。不幸的是,像素格式似乎不匹配。
我是 iOS 编程和多媒体的新手,我正在研究一个名为 RosyWriter 的示例项目,该项目由 apple 在 this link 提供。 .在这里,我看到在代码中有一个名为 captureOutp
我正在我的 iOS 应用程序中录制实时视频。在另一个 Stack Overflow page ,我发现您可以使用 vImage_Buffer 处理我的帧。 问题是我不知道如何从输出的 vImage_b
我们曾经像下面这样初始化 CVPixelBufferRef。 CVPixelBufferRef pxbuffer = NULL; 但是在 Swift 中我们不能使用 NULL,所以我们尝试了下面的
在 objective-c 中,您可以轻松地将 CVImageBufferRef 转换为 CVPixelBufferRef: CMSampleBufferRef sampleBuffer = some
我想将 UIImage 对象转换为 CVPixelBufferRef 对象,但我完全不知道。而且我找不到执行此类操作的任何示例代码。 有人可以帮帮我吗?提前致谢! 你好 最佳答案 有不同的方法可以做到
我正在使用 BlackMagic DeckLink SDK 尝试从 BM 设备捕获帧。 我正在尝试从 DeckLinkController::VideoInputFrameArrived 回调中的 I
尝试在 SCNRender 对象的每次调用渲染上从 MTLTexture 创建 CVPixelBufferRef: CVPixelBufferLockBaseAddress(pixelBuffer
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
如何从 CVPixelBufferRef 获取 RGB(或任何其他格式)像素值?我尝试了很多方法,但都没有成功。 func captureOutput(captureOutput: AVCapture
我正在使用 AVCaptureSession 和 AVCapturePhotoOutput 以 kCVPixelFormatType_14Bayer_RGGB 格式从设备相机捕获 RAW 照片数据。
我正在编写自定义电影录制应用程序,并实现了 AVAssetWriter 和 AVAssetWriterInputPixelBufferAdaptor 以将帧写入文件。在 DataOutputDeleg
我是一名优秀的程序员,十分优秀!