- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经构建了一些代码来逐帧处理 OSX 上的视频文件。以下是代码的摘录,它构建 OK,打开文件,定位视频轨道(仅轨道)并开始读取 CMSampleBuffers 没有问题。但是,当我尝试提取像素缓冲区帧时,我获得的每个 CMSampleBufferRef 都返回 NULL。 iOS 文档中没有说明为什么我可以期望 NULL 返回值或我可以期望如何解决问题。无论捕获源或编解码器如何,我测试过的所有视频都会发生这种情况。
非常感谢任何帮助。
NSString *assetInPath = @"/Users/Dave/Movies/movie.mp4";
NSURL *assetInUrl = [NSURL fileURLWithPath:assetInPath];
AVAsset *assetIn = [AVAsset assetWithURL:assetInUrl];
NSError *error;
AVAssetReader *assetReader = [AVAssetReader assetReaderWithAsset:assetIn error:&error];
AVAssetTrack *track = [assetIn.tracks objectAtIndex:0];
AVAssetReaderOutput *assetReaderOutput = [[AVAssetReaderTrackOutput alloc]
initWithTrack:track
outputSettings:nil];
[assetReader addOutput:assetReaderOutput];
// Start reading
[assetReader startReading];
CMSampleBufferRef sampleBuffer;
do {
sampleBuffer = [assetReaderOutput copyNextSampleBuffer];
/**
** At this point, sampleBuffer is non-null, has all appropriate attributes to indicate that
** it's a video frame, 320x240 or whatever and looks perfectly fine. But the next
** line always returns NULL without logging any obvious error message
**/
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
if( pixelBuffer != NULL ) {
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
...
other processing removed here for clarity
}
} while( ... );
最佳答案
您尚未指定任何 outputSettings
创建您的 AVAssetReaderTrackOutput
时.我在指定“nil”以便在调用 copyNextSampleBuffer
时接收视频轨道的原始像素格式时遇到了您的问题。 .在我的应用程序中,我想确保在调用 copyNextSampleBuffer
时不会发生任何转换。为了性能,如果这对您来说不是大问题,请在输出设置中指定像素格式。
以下是苹果根据硬件能力推荐的像素格式:
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
关于macos - 为什么 CMSampleBufferGetImageBuffer 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16861047/
我正在尝试从 CMSampleBufferRef 检索 CVPixelBufferRef,以便更改 CVPixelBufferRef 以动态覆盖水印。 我正在使用 CMSampleBufferGetI
我每 N 个视频帧从 CMSampleBufferRef 视频缓冲区获取一个 UIImage,例如: - (void)imageFromVideoBuffer:(void(^)(UIImage* im
我已经构建了一些代码来逐帧处理 OSX 上的视频文件。以下是代码的摘录,它构建 OK,打开文件,定位视频轨道(仅轨道)并开始读取 CMSampleBuffers 没有问题。但是,当我尝试提取像素缓冲区
我使用此代码从相机捕获视频,但 CMSampleBufferGetImageBuffer(sampleBuffer) 始终返回 nil。问题是什么?。这是代码,我修改了此源代码以适应 Swift 4
这是我的代码: -(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferR
'CMSampleBufferGetImageBuffer' has been replaced by property 'CMSampleBuffer.imageBuffer' CMSampleBu
我是一名优秀的程序员,十分优秀!