Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-使用AvassetWriterInputPixelBufferAdapter录制视频时从麦克风捕获音频_Iphone_Avfoundation_Screen Capture_Avassetwriter - Fatal编程技术网

iPhone-使用AvassetWriterInputPixelBufferAdapter录制视频时从麦克风捕获音频

iPhone-使用AvassetWriterInputPixelBufferAdapter录制视频时从麦克风捕获音频,iphone,avfoundation,screen-capture,avassetwriter,Iphone,Avfoundation,Screen Capture,Avassetwriter,我正在尝试制作一个应用程序,将UIImageView的内容与麦克风音频一起录制,并实时录制到视频中。(有点像会说话的汤姆猫应用程序) 我正在使用AvassetWriterInputPixelBufferAdapter记录UIImageView的内容,但我根本不知道如何将音频与此结合起来。这也不是因为缺乏尝试,我已经花了一个多星期的时间研究这个具体问题,梳理了这个网站、谷歌、iphone开发者forumns等等。这不是我喜欢的 与此最接近的参考是: 我可以分别捕获视频和音频,然后在事后将它们编码

我正在尝试制作一个应用程序,将UIImageView的内容与麦克风音频一起录制,并实时录制到视频中。(有点像会说话的汤姆猫应用程序)

我正在使用AvassetWriterInputPixelBufferAdapter记录UIImageView的内容,但我根本不知道如何将音频与此结合起来。这也不是因为缺乏尝试,我已经花了一个多星期的时间研究这个具体问题,梳理了这个网站、谷歌、iphone开发者forumns等等。这不是我喜欢的

与此最接近的参考是:

我可以分别捕获视频和音频,然后在事后将它们编码在一起(我真的很努力地解决了这个问题),但让这个应用程序实时录制是非常理想的

以下是一些框架代码,演示了我迄今为止的录制:

这是.h文件

//
//  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" );
          }