录制视频,如“会说话的汤姆”iphone(添加音频时出现问题)

时间:2011-10-30 05:15:29

标签: iphone ios screenshot video-capture

我必须录制一个与“会说话的汤姆”完全相似的应用视频。 在HereHere的帮助下,我已经捕获了屏幕,并使用这些图像制作了视频,但没有任何声音。

我分别录制了声音和视频文件,但不知道如何添加它们

任何人都可以告诉我如何为此视频添加声音如何录制声音

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

-(void) processVideo: (NSURL*) videoUrl{   
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL: videoUrl options:nil];

AVMutableComposition* mixComposition = [AVMutableComposition composition];

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSError * error = nil;

for (NSMutableDictionary * audioInfo in appDelegate.audioInfoArray)
{
    NSString *pathString = [[NSHomeDirectory() stringByAppendingString:@”/Documents/”] stringByAppendingString: [audioInfo objectForKey: @”fileName”]];

    AVURLAsset * urlAsset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:pathString] options:nil];

    AVAssetTrack * audioAssetTrack = [[urlAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
    AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                                                                                   preferredTrackID: kCMPersistentTrackID_Invalid];

    NSLog(@”%lf”, [[audioInfo objectForKey: @”startTime”] doubleValue]);

    CMTime audioStartTime = CMTimeMake(([[audioInfo objectForKey: @”startTime”] doubleValue]*TIME_SCALE), TIME_SCALE);

    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,urlAsset.duration) ofTrack:audioAssetTrack atTime:audioStartTime error:&error];      
}


AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                                                                               preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
                                atTime:kCMTimeZero error:nil];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                                                                      presetName:AVAssetExportPresetPassthrough];   

NSString* videoName = @”export.mov”;

NSString *exportPath = [[self pathToDocumentsDirectory] stringByAppendingPathComponent:videoName];
NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath];

if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}

_assetExport.outputFileType = @”com.apple.quicktime-movie”;
NSLog(@”file type %@”,_assetExport.outputFileType);
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {
     switch (_assetExport.status) 
     {
         case AVAssetExportSessionStatusCompleted:
             //export complete 
             NSLog(@”Export Complete”);
             //[self uploadToYouTube];

             break;
         case AVAssetExportSessionStatusFailed:
             NSLog(@”Export Failed”);
             NSLog(@”ExportSessionError: %@”, [_assetExport.error localizedDescription]);
             //export error (see exportSession.error)  
             break;
         case AVAssetExportSessionStatusCancelled:
             NSLog(@”Export Failed”);
             NSLog(@”ExportSessionError: %@”, [_assetExport.error localizedDescription]);
             //export cancelled  
             break;
     }
 }];    }

只需将您的电影文件(即没有音频)分配给NSURL并将其传递给上述ProcessVideo方法。然后在调用之前在audioInfoArray中的其他位置添加您的Sound文件(您希望与视频合并) processVideo方法。然后它会将您的音频与视频文件合并。

您还可以根据audioinfoArray中“startTime”键下指定的值决定视频在视频中的播放位置。使用Switch Case,您可以根据自己的意愿播放视频,上传到Facebook等。

答案 1 :(得分:0)

iOS应用无法真正记录(使用任何公共API)其自身产生的声音。应用程序可以做的是两次生成相同的音频,一个用于播放,一个用于流式传输到文件。你必须坚持只知道如何做两种方式的声音,例如将PCM波形复制到缓冲区等。

一旦你有了音频样本的重复缓冲区,就应该有关于如何将它发送到AVAssetWriter的示例代码。