AVAssetWriterInputPixelBufferAdaptor 返回空像素缓冲池
我确定我的缓冲区属性出了问题,但我不清楚是什么问题——没有很好地记录应该放在那里的内容,所以我根据 CVPixelBufferPoolCreate 和 Core Foundation 进行猜测对我来说几乎是一本合上的书。
// "width" and "height" are const ints
CFNumberRef cfWidth = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &width);
CFNumberRef cfHeight = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &height);
CFStringRef keys[] = {
kCVPixelBufferWidthKey,
kCVPixelBufferHeightKey,
kCVPixelBufferCGImageCompatibilityKey
};
CFTypeRef values[] = {
cfWidth,
cfHeight,
kCFBooleanTrue
};
int numValues = sizeof(keys) / sizeof(keys[0]);
CFDictionaryRef bufferAttributes = CFDictionaryCreate(kCFAllocatorDefault,
(const void **)&keys,
(const void **)&values,
numValues,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks
);
AVAssetWriterInputPixelBufferAdaptor *adaptor = [[AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:(NSDictionary*)bufferAttributes] retain];
CVPixelBufferPoolRef bufferPool = adaptor.pixelBufferPool;
NSParameterAssert(bufferPool != NULL); // fails
I'm sure something's wrong with my buffer attributes, but it's not clear to me what -- it's not well documented what's supposed to go there, so I'm guessing based on CVPixelBufferPoolCreate
-- and Core Foundation is pretty much a closed book to me.
// "width" and "height" are const ints
CFNumberRef cfWidth = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &width);
CFNumberRef cfHeight = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &height);
CFStringRef keys[] = {
kCVPixelBufferWidthKey,
kCVPixelBufferHeightKey,
kCVPixelBufferCGImageCompatibilityKey
};
CFTypeRef values[] = {
cfWidth,
cfHeight,
kCFBooleanTrue
};
int numValues = sizeof(keys) / sizeof(keys[0]);
CFDictionaryRef bufferAttributes = CFDictionaryCreate(kCFAllocatorDefault,
(const void **)&keys,
(const void **)&values,
numValues,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks
);
AVAssetWriterInputPixelBufferAdaptor *adaptor = [[AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:(NSDictionary*)bufferAttributes] retain];
CVPixelBufferPoolRef bufferPool = adaptor.pixelBufferPool;
NSParameterAssert(bufferPool != NULL); // fails
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
对于每个仍在寻找解决方案的人:
首先,通过检查其状态来确保您的 AVAssetWriter 正常工作。我遇到了这个问题,在检查状态后,虽然我已经调用了一些启动命令,但编写器还没有开始。(在我的例子中,我已将写入路径指向现有文件,因此删除后它,它就像一个魅力)
For every one still looking for the solution:
Firstly, make sure your AVAssetWriter is working properly by checking it's status. I've had this problem and after checking the status, although I've call start some what, the writer just haven't started yet.(In my case, I've point the writing path to an existing file, so after deleting it, it work like a charm)
我一切顺利!将选项字典设置为兼容性后,他们说可以使用缓冲池,这里是工作示例和没有缓冲区的编写代码,但它是一个很好的起点。
这是示例代码链接
这是您需要的代码:
I got it all working! With the options dictionary set to compatibility, they say its possible to use the Buffer pool, Here is working samples and Code for writing without the buffer, but its a good place to start.
Here is the sample code link
Here is the code you need:
当
outputURL
处没有AVAssetWriter
的文件时,它会起作用。用法
It works when there is no file at
outputURL
forAVAssetWriter
.Usage
当 PixelBufferPool 返回 null 时,请检查以下内容:
1. the output file of the AVAssetsWriter doesn't exist.
2. use the pixelbuffer after calling startSessionAtTime: on the AVAssetsWriter.
3. the settings of AVAssetWriterInput and AVAssetWriterInputPixelBufferAdaptor are correct.
4. the present times of appendPixelBuffer uses are not the same.
When the pixelBufferPool returns null, check the following:
1. the output file of the AVAssetsWriter doesn't exist.
2. use the pixelbuffer after calling startSessionAtTime: on the AVAssetsWriter.
3. the settings of AVAssetWriterInput and AVAssetWriterInputPixelBufferAdaptor are correct.
4. the present times of appendPixelBuffer uses are not the same.
我遇到了同样的问题,我认为这可能是因为您没有正确配置
AVAssetWriterInput
。完成此操作后,我的游泳池开始工作。特别是,除非我在 AVVideoCompressionPropertiesKey 中提供了数据,否则该池不会为我提供像素缓冲区。首先,创建并完全配置AVAssetWriter
(在
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVVideoSettings.h
中查找键和值。outputSettings
和compressionSettings
的值):创建像素缓冲区适配器:
然后使用以下方法从其池中检索像素缓冲区:
I had the same problem, and I think it is possibly because you have not configured your
AVAssetWriterInput
correctly. My pool started working after I had done this. In particular, the pool would not give me pixel buffers unless I had provided data inAVVideoCompressionPropertiesKey
. First, create and fully configure theAVAssetWriter
(Look in
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/AVFoundation.framework/Headers/AVVideoSettings.h
for keys & values foroutputSettings
andcompressionSettings
):Create the pixel buffer adaptor:
Then retrieve pixel buffers from its pool using:
根据文档:
“在第一次调用关联的 AVAssetWriter 对象上的 startSessionAtTime: 之前,此属性为 NULL。”
因此,如果您尝试过早访问该池,它将为 NULL。我自己正在学习这些东西,所以目前无法详细说明。
According to the documentation:
"This property is NULL before the first call to startSessionAtTime:on the associated AVAssetWriter object."
So if you'e trying to access the pool too early, it will be NULL. I'm just learning this stuff myself so I can't really elaborate at the moment.