我必须录制一个与“会说话的汤姆”完全相似的应用视频。 在Here和Here的帮助下,我已经捕获了屏幕,并使用这些图像制作了视频,但没有任何声音。
我分别录制了声音和视频文件,但不知道如何添加它们
任何人都可以告诉我如何为此视频添加声音或如何录制声音。
有人可以帮忙吗?
答案 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的示例代码。