Tag: avassetwriter

使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput时的性能问题

当我使用AVCaptureVideoDataOutput和AVCaptureAudioDataOutput录制audio+video时,我遇到了滞后问题。 有时video会阻塞几毫秒,有时audio与video不同步。 我插入了一些日志,并观察到,首先,我在captureOutputcallback中获得了很多video缓冲区,过了一段时间,我得到了audio缓冲区(有时候根本没有收到audio缓冲区,结果是没有声音)。 如果我评论处理video缓冲区的代码,我得到的audio缓冲区没有问题。 这是我正在使用的代码: -(void)initMovieOutput:(AVCaptureSession *)captureSessionLocal { AVCaptureVideoDataOutput *dataOutput = [[AVCaptureVideoDataOutput alloc] init]; self._videoOutput = dataOutput; [dataOutput release]; self._videoOutput.alwaysDiscardsLateVideoFrames = NO; self._videoOutput.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey ]; AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init]; self._audioOutput = audioOutput; [audioOutput release]; [captureSessionLocal addOutput:self._videoOutput]; [captureSessionLocal addOutput:self._audioOutput]; // Setup the queue dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL); [self._videoOutput […]

AVAssetWriterinputH.264直通到QuickTime(.mov) – 传入SPS / PPS来创buildavcCprimefaces?

我有一个由types1(P帧),5(I帧),7(SPS)和8(PPS)组成的H.264 / AVC NALstream。 我想把它们写入一个.mov文件而不用重新编码。 我试图使用AVAssetWriter来做到这一点。 AVAssetWriterInput的文档状态: 对outputSettings传递nil指示input通过附加采样,在写入输出文件之前不做任何处理。 例如,如果您正在追加已经处于所需压缩格式的缓冲区,这非常有用。 但是,只有在写入QuickTime影片文件(即AVAssetWriter用AVFileTypeQuickTimeMovie初始化)时才支持直通。 对于其他文件types,您必须指定非零输出设置。 我试图从这些NAL中创buildCMSampleBuffers并将它们附加到资产编写器input,但是我无法以产生格式正确的.mov文件的方式input数据,而且我无法在任何地方find任何线索如何做到这一点。 到目前为止,最好的结果是以附件B字节stream格式(以7 8 5 1 1 1 ….重复的顺序)传递NAL,并在VLC中播放结果。 因此,我知道NAL包含有效的数据,但由于.mov文件没有avcCprimefaces,mdatprimefaces填充了附件B字节stream,所以QuickTime不会播放video。 现在,我试图传入4个字节(由lengthSizeMinusOne字段指定)长度字段而不是附件B分隔符的lengthSizeMinusOne ,这就是应该如何将它们打包到mdatprimefaces中,直到我知道。 我不知道如何让资产编写者写一个avcCprimefaces。 我追加的每个样本都被推入mdatprimefaces。 有谁知道我可以传递原始的H.264数据到AVAssetWriterInputconfiguration为通过(nil outputSettings)并让它生成一个正确形成的QuickTime文件?

AVAssetWriter祸患

我正在尝试使用AVAssetWriter将CGImages写入文件以从图像创buildvideo。 我已经在模拟器上以三种不同的方式成功地完成了这个工作,但是每个方法在运行iOS 4.3的iPhone 4上都失败了。 这一切都与像素缓冲区有关。 我的第一个方法是根据需要创build像素缓冲区而不使用池。 这是有效的,但是在设备上工作的内存太多了。 我的第二个方法是使用推荐的AVAssetWriterInputPixelBufferAdaptor,然后从CVPixelBufferPoolCreatePixelBuffer从适配器pixelBufferPool中提取像素缓冲区。 这也适用于模拟器,但在设备上失败,因为适配器的像素缓冲池永远不会被分配。 我没有得到任何错误消息。 最后,我试图用CVPixelBufferPoolCreate创build自己的像素缓冲池。 这也适用于模拟器,但在设备上,一切工作正常,直到我尝试appendPixelBuffer追加像素缓冲区,每次失败。 我在网上发现了很less的信息。 我已经将我的代码基于我发现的例子,但现在几天没有运气。 如果任何人有成功AVAssetWriter这样做的经验,请看看,让我知道,如果你看到任何不合适的地方。 注:您将看到注释掉的尝试块。 首先,设置 – (BOOL) openVideoFile: (NSString *) path withSize:(CGSize)imageSize { size = CGSizeMake (480.0, 320.0);//imageSize; NSError *error = nil; videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie error:&error]; if (error != nil) return NO; NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber […]

AVAssetWriter如何创build没有压缩的movvideo?

我从一系列图像创buildvideo。 我的工作的目的是创build一个没有压缩的.movvideo。 我已经在开发库中看到它存在一个关键“AVVideoCompressionPropertiesKey”,但我不知道如何用这个键指定没有压缩。 请问你能帮帮我吗? 这是我的示例代码: NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:320], AVVideoCleanApertureWidthKey, [NSNumber numberWithInt:480], AVVideoCleanApertureHeightKey, [NSNumber numberWithInt:10], AVVideoCleanApertureHorizontalOffsetKey, [NSNumber numberWithInt:10], AVVideoCleanApertureVerticalOffsetKey, nil]; NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:960000], AVVideoAverageBitRateKey, [NSNumber numberWithInt:1],AVVideoMaxKeyFrameIntervalKey, videoCleanApertureSettings, AVVideoCleanApertureKey, nil]; NSDictionary *videoOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,codecSettings,AVVideoCompressionPropertiesKey, [NSNumber numberWithInt:size.width], AVVideoWidthKey, [NSNumber numberWithInt:size.height], AVVideoHeightKey, nil]; self.videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoOutputSettings];

像素格式,CVPixelBufferRefs和glReadPixels

我使用glReadPixels将数据读入CVPixelBufferRef 。 我使用CVPixelBufferRef作为CVPixelBufferRef的input。 不幸的是,像素格式似乎是不匹配的。 我认为glReadPixels正在返回RGBA格式的像素数据,而AVAssetWriter ARGB格式的像素数据。 将RGBA转换成ARGB的最佳方法是什么? 以下是我迄今为止所尝试的: 按照argb =(rgba >> 8)|的方式进行位操作 (rgba << 24) 使用CGImageRef作为中间步骤 位操作不起作用,因为CVPixelBufferRef似乎不支持下标。 CGImageRef中间步骤可以工作,但是我不希望有50多行代码可能会影响性能。

将video+生成的audio写入AVAssetWriterInput,audio口吃

我从iOS上的Unity应用程序生成video。 我使用iVidCap,它使用AVFoundation来做到这一点。 那边一切正常。 本质上,video是通过使用纹理渲染目标并将帧传递给Obj-C插件来渲染的。 现在我需要添加audio到video。 audio将是特定时间发生的声音效果,也可能是一些背景音效。 正在使用的文件实际上是Unity应用程序的内部资源。 我可能会写这些到电话存储,然后生成一个AVComposition,但我的计划是要避免这种情况,并在浮点格式缓冲区(从audio剪辑获取audio以浮点格式)复合audio。 我可能会稍后在飞行audio效果。 几个小时后,我设法录制audio,并播放video…但它结结巴巴。 目前,我只是在每个video帧的持续时间内生成一个方波,并将其写入AVAssetWriterInput。 之后,我将生成我实际需要的audio。 如果我生成一个大样本,我不会得到口吃。 如果我把它写成块(我更喜欢分配一个巨大的数组),那么audio块似乎相互剪辑: 我似乎无法弄清楚这是为什么。 我很确定我正在为audio缓冲区获取正确的时间戳,但也许我正在做这整个部分不正确。 或者我需要一些标志来让video同步到audio? 我不能看到这是问题,因为我可以在将audio数据提取到wav之后在波形编辑器中看到问题。 编写audio的相关代码: – (id)init { self = [super init]; if (self) { // [snip] rateDenominator = 44100; rateMultiplier = rateDenominator / frameRate; sample_position_ = 0; audio_fmt_desc_ = nil; int nchannels = 2; AudioStreamBasicDescription audioFormat; bzero(&audioFormat, sizeof(audioFormat)); audioFormat.mSampleRate = […]

OpenGL ES 2.0到iPad / iPhone上的video

尽pipeStackOverflow中有很好的信息,但我仍然在这里结束 我正在尝试在iPad 2上使用iOS 4.3编写一个OpenGL渲染缓冲区到video。 这正是我正在尝试的: A)设置一个AVAssetWriterInputPixelBufferAdaptor 创build一个指向video文件的AVAssetWriter 设置适当的设置AVAssetWriterInput 设置AVAssetWriterInputPixelBufferAdaptor将数据添加到video文件 B)使用AVAssetWriterInputPixelBufferAdaptor将数据写入video文件 将OpenGL代码渲染到屏幕上 通过glReadPixels获取OpenGL缓冲区 从OpenGL数据创build一个CVPixelBufferRef 使用appendPixelBuffer方法将PixelBuffer附加到AVAssetWriterInputPixelBufferAdaptor 但是,我有这个问题。 我现在的策略是当按下button时设置AVAssetWriterInputPixelBufferAdaptor。 一旦AVAssetWriterInputPixelBufferAdaptor有效,我设置一个标志来指示EAGLView创build一个像素缓冲区,并通过appendPixelBuffer将它附加到video文件中给定数量的帧。 现在我的代码崩溃,因为它试图追加第二个像素缓冲区,给我以下错误: -[__NSCFDictionary appendPixelBuffer:withPresentationTime:]: unrecognized selector sent to instance 0x131db0 这里是我的AVAsset设置代码(很多是基于Rudy Aramayo的代码,它在正常的图像上工作,但没有设置纹理): – (void) testVideoWriter { //initialize global info MOVIE_NAME = @"Documents/Movie.mov"; CGSize size = CGSizeMake(480, 320); frameLength = CMTimeMake(1, 5); currentTime = kCMTimeZero; currentFrame = 0; NSString *MOVIE_PATH […]