iPhone-使用AvassetWriterInputPixelBufferAdapter录制视频时从麦克风捕获音频
我正在尝试制作一个应用程序,将UIImageView的内容与麦克风音频一起录制,并实时录制到视频中。(有点像会说话的汤姆猫应用程序) 我正在使用AvassetWriterInputPixelBufferAdapter记录UIImageView的内容,但我根本不知道如何将音频与此结合起来。这也不是因为缺乏尝试,我已经花了一个多星期的时间研究这个具体问题,梳理了这个网站、谷歌、iphone开发者forumns等等。这不是我喜欢的 与此最接近的参考是: 我可以分别捕获视频和音频,然后在事后将它们编码在一起(我真的很努力地解决了这个问题),但让这个应用程序实时录制是非常理想的 以下是一些框架代码,演示了我迄今为止的录制: 这是.h文件iPhone-使用AvassetWriterInputPixelBufferAdapter录制视频时从麦克风捕获音频,iphone,avfoundation,screen-capture,avassetwriter,Iphone,Avfoundation,Screen Capture,Avassetwriter,我正在尝试制作一个应用程序,将UIImageView的内容与麦克风音频一起录制,并实时录制到视频中。(有点像会说话的汤姆猫应用程序) 我正在使用AvassetWriterInputPixelBufferAdapter记录UIImageView的内容,但我根本不知道如何将音频与此结合起来。这也不是因为缺乏尝试,我已经花了一个多星期的时间研究这个具体问题,梳理了这个网站、谷歌、iphone开发者forumns等等。这不是我喜欢的 与此最接近的参考是: 我可以分别捕获视频和音频,然后在事后将它们编码
//
// RecordingTestProjectViewController.h
// RecordingTestProject
//
// Created by Sean Luck on 7/26/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <CoreMedia/CoreMedia.h>
#import <CoreVideo/CoreVideo.h>
#import <QuartzCore/QuartzCore.h>
@interface RecordingTestProjectViewController : UIViewController
{
UIImageView *testView;
NSTimer *theTimer;
NSTimer *assetWriterTimer;
AVMutableComposition *mutableComposition;
AVAssetWriter *assetWriter;
AVAssetWriterInput *assetWriterInput;
AVAssetWriterInput *_audioWriterInput;
AVCaptureDeviceInput *audioInput;
AVCaptureSession *_capSession;
AVAssetWriterInputPixelBufferAdaptor *assetWriterPixelBufferAdaptor;
CFAbsoluteTime firstFrameWallClockTime;
int count;
}
-(void) writeSample: (NSTimer*) _timer;
-(void) startRecording;
-(void) pauseRecording;
-(void) stopRecording;
-(NSString*) pathToDocumentsDirectory;
@end
//
//RecordingTestProjectViewController.h
//记录测试项目
//
//由肖恩·勒克于2011年7月26日创作。
//版权所有2011年uu MyCompanyName uuu。版权所有。
//
#进口
#进口。我做了一些小而适度的修改,并清理了内存泄漏。我刚刚发现,如果要将麦克风与录制的视频一起使用,CMTIMESTAMP必须同步。我试图通过使用CMSampleBufferSetOutputPresentationTimeStamp更改音频上的采样时间来同步它们…但是我缺少了一些东西或者它不起作用。如果您捕获麦克风开始的时间并将其作为偏移量添加到视频中,StackOverflow上AVAssetWriter的每个示例似乎都可以正常工作-
以下是我为保持视频与麦克风同步所做的工作:
Img = Image
Snd = Sound
Avmedia = AVAssetWriter
etc.
#define Cmtm__Pref_Timescale_uk 10000
CMTime Duration_cmtm = CMTimeMakeWithSeconds( Avmedia_v->Img_Duration__Sec_df, Cmtm__Pref_Timescale_uk );
Avmedia_v->Img_cmtm = CMTimeAdd( Duration_cmtm, Avmedia_v->Exprt__Begin_cmtm );
if( [ Avmedia_v->Clrbuf__Adaptor_v appendPixelBuffer: Clrbuf_v withPresentationTime:
Avmedia_v->Img_cmtm ] is no )
{
//If the operation was unsuccessful,
//invoke the AVAssetWriter object’s finishWriting method in order to save a partially completed asset.
[ Avmedia_v->Avwriter_v finishWriting ];
CLog( Lv_Minor, "Movie Img exprt failed" );
}
您是否尝试在asset writer上设置音频捕获源和音频输出?检查WWDC 2010源程序包中的AVCamDemo代码。它将有代码捕获音频并将其写入MOV文件。是的,我真的不能胜任这个代码。我真的很惊讶我居然能修复内存泄漏。谢谢你的建议,我会给它一看,看看我是否能得到实施-肖恩
Img = Image
Snd = Sound
Avmedia = AVAssetWriter
etc.
#define Cmtm__Pref_Timescale_uk 10000
CMTime Duration_cmtm = CMTimeMakeWithSeconds( Avmedia_v->Img_Duration__Sec_df, Cmtm__Pref_Timescale_uk );
Avmedia_v->Img_cmtm = CMTimeAdd( Duration_cmtm, Avmedia_v->Exprt__Begin_cmtm );
if( [ Avmedia_v->Clrbuf__Adaptor_v appendPixelBuffer: Clrbuf_v withPresentationTime:
Avmedia_v->Img_cmtm ] is no )
{
//If the operation was unsuccessful,
//invoke the AVAssetWriter object’s finishWriting method in order to save a partially completed asset.
[ Avmedia_v->Avwriter_v finishWriting ];
CLog( Lv_Minor, "Movie Img exprt failed" );
}