- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我使用下面的代码将图像写入视频
-(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size
{
NSLog(@"Write Started");
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:path] fileType:AVFileTypeMPEG4
error:&error];
NSParameterAssert(videoWriter);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width], AVVideoWidthKey,
[NSNumber numberWithInt:size.height], AVVideoHeightKey,
nil];
AVAssetWriterInput* videoWriterInput = [[AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput
sourcePixelBufferAttributes:nil];
NSParameterAssert(videoWriterInput);
NSParameterAssert([videoWriter canAddInput:videoWriterInput]);
videoWriterInput.expectsMediaDataInRealTime = YES;
[videoWriter addInput:videoWriterInput];
//Start a session:
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
CVPixelBufferRef buffer = NULL;
//convert uiimage to CGImage.
int frameCount = 16;
int kRecordingFPS = 30;
UIImage * im = [UIImage imageNamed:@"IMG_0103.JPG"];
NSArray * imageArray = [[NSArray alloc]initWithObjects:im,im,im,im,im,im,im,im,im,im,im,im,im,im,im,im, nil];
for(UIImage * img in imageArray)
{
buffer = [self pixelBufferFromCGImage:[img CGImage] andSize:size];
BOOL append_ok = NO;
int j = 0;
while (!append_ok && j < 30)
{
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
printf("appending %d attemp %d\n", frameCount, j);
CMTime frameTime = CMTimeMake(frameCount,(int32_t) kRecordingFPS);
append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
if(buffer)
CVBufferRelease(buffer);
[NSThread sleepForTimeInterval:0.05];
}
else
{
printf("adaptor not ready %d, %d\n", frameCount, j);
[NSThread sleepForTimeInterval:0.1];
}
j++;
}
if (!append_ok) {
printf("error appending image %d times %d\n", frameCount, j);
}
frameCount++;
}
//Finish the session:
[videoWriterInput markAsFinished];
[videoWriter finishWriting];
NSLog(@"Write Ended");
[videoWriterInput release];
[videoWriter release];
[imageArray release];
}
它第一次工作,但如果我运行代码 2.3 次或更多次,它报道:
!appending 0 0-0 attemp 0
!appending 0 0-0 attemp 1
My App(11385,0xb0103000) malloc: *** error for object 0x9ab4270: double free
*** set a breakpoint in malloc_error_break to debug
!appending 0 0-0 attemp 2
My App(11385,0xb0103000) malloc: *** error for object 0x9ab4270: double free
*** set a breakpoint in malloc_error_break to debug
!appending 0 0-0 attemp 3
有时会导致崩溃
我试图找到原因,但没有结果,
欢迎您的评论
最佳答案
而不是使用 [NSThread sleepForTimeInterval:0.1];利用同时(!adaptor.assetWriterInput.readyForMoreMediaData){}
因为很多时候 readyForMoreMediaData 从未在 0.1 时间间隔内设置为 YES。
同时尝试释放被 appendPixelBuffer:withPresentationTime: 方法占用的内存实际上这个方法会阻止你成功运行
关于iphone - AVAssetWriterInputPixelBufferAdaptor appendPixelBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13523535/
我使用下面的代码将图像写入视频 -(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size { NSLo
我确定我的缓冲区属性有问题,但我不清楚是什么 -- 没有很好地记录应该去那里的内容,所以我猜测基于 CVPixelBufferPoolCreate -- Core Foundation 对我来说几乎是
我正在尝试制作一个应用程序来记录 UIImageView 的内容以及麦克风音频,并将它们实时记录到视频中。 (有点像会说话的汤姆猫应用程序) 我正在使用 AVAssetWriterInputPixel
我正在捕捉相机画面并将其写入电影。我遇到的问题是,在导出电影之后,它前面有几秒钟的黑色(相对于实际录制开始时间)。 我认为这与[self.assetWriter startSessionAtSourc
我将 CVPixelBufferRefs 附加到连接到 AVAssetWriterInput 的 AVAssetWriterInputPixelBufferAdaptor 以使用 AVAssetWri
我正在尝试以预期的帧速率将 CVPixelBuffers 附加到 AVAssetWriterInputPixelBufferAdaptor,但它似乎太快了,而且我的数学失败了。这不是从相机捕捉,而是捕
我正在使用 AVAssetWriterInputPixelBufferAdaptor 将一些帧写入视频,并且行为 w.r.t.时间不是我所期望的。 如果我只写一帧: [videoWriter sta
我正在尝试使用为 encoding asset writer 提供的示例的组合。以及 pixelBufferFromCGImage 提供的样本在我正在导出的 AVAsset 上覆盖 UIImage。
我在 AVAssetWriterInputPixelBufferAdaptor 中使用 pixelBufferPool 来创建像素缓冲区以与 append 方法一起使用。创建4个buffer后,pix
我正在从一组图像创建一个视频文件。我能够在模拟器上创建视频文件,但是当我尝试在设备上运行相同的代码时,它会出现以下错误: NSURLErrorDomain Code=-3000 "Cannot cre
我已经使用以下代码成功地从图像创建了视频 -(void)writeImageAsMovie:(NSArray *)array toPath:(NSString*)path size:(CGSize)s
我正在尝试使用 ReplayKit 记录我的应用程序的屏幕,在录制视频时裁剪掉其中的某些部分。不太顺利。 ReplayKit 将捕获整个屏幕,因此我决定从 ReplayKit 接收每一帧(作为 CMS
我是一名优秀的程序员,十分优秀!