Ios5 如何合并视频和音频文件?
我的问题是:如何合并具有几乎相同持续时间的视频和音频文件 我搜索了一下,得到了这个问题的一些答案。然而,当我尝试他们给出的代码时,它不会产生“非零字节”电影 你能看一下,看看哪里出了问题吗Ios5 如何合并视频和音频文件?,ios5,avassetwriter,avassetexportsession,avcomposition,Ios5,Avassetwriter,Avassetexportsession,Avcomposition,我的问题是:如何合并具有几乎相同持续时间的视频和音频文件 我搜索了一下,得到了这个问题的一些答案。然而,当我尝试他们给出的代码时,它不会产生“非零字节”电影 你能看一下,看看哪里出了问题吗 -(void)putTogether { NSLog(@"Starting to put together all the files!"); AVMutableComposition *mixComposition = [AVMutableComposition composition]; NSStri
-(void)putTogether
{
NSLog(@"Starting to put together all the files!");
AVMutableComposition *mixComposition = [AVMutableComposition composition];
NSString *audioPath = @"/Users/admin/Documents/Sound.caf";
NSURL *audioUrl = [NSURL fileURLWithPath:audioPath];
//AVURLAsset *audioasset = [AVURLAsset URLAssetWithURL:audioUrl options:nil];
AVURLAsset *audioasset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
NSString *videoPath = @"/Users/admin/Documents/video.mp4";
NSURL *videoUrl = [NSURL fileURLWithPath:videoPath];
//AVURLAsset *videoasset = [AVURLAsset URLAssetWithURL:videoUrl options:nil];
AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
NSString *moviepath = @"/Users/admin/Documents/fmovie.mov";
NSURL *movieUrl = [NSURL fileURLWithPath:moviepath];
if([[NSFileManager defaultManager] fileExistsAtPath:moviepath])
{
[[NSFileManager defaultManager] removeItemAtPath:moviepath error:nil];
}
AVMutableCompositionTrack *compositionTrackB = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *clipVideoTrackB = [[videoasset tracksWithMediaType:AVMediaTypeVideo] lastObject];
[compositionTrackB insertTimeRange:CMTimeRangeMake( kCMTimeZero, videoasset.duration) ofTrack:clipVideoTrackB atTime:kCMTimeZero error:nil];
AVMutableCompositionTrack *compositionTrackA = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *clipAudioTrackA = [[audioasset tracksWithMediaType:AVMediaTypeAudio] lastObject];
[compositionTrackA insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioasset.duration) ofTrack:clipAudioTrackA atTime:kCMTimeZero error:nil];
AVAssetExportSession *exporter =[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
//AVAssetExportSession *exporter =[AVAssetExportSession exportSessionWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality];
NSParameterAssert(exporter!=nil);
exporter.outputFileType=AVFileTypeQuickTimeMovie;
exporter.outputURL=movieUrl;
CMTime start=CMTimeMake(0, 600);
CMTime duration=CMTimeMake(600, 600);
CMTimeRange range=CMTimeRangeMake(start, duration);
exporter.timeRange=range;
[exporter exportAsynchronouslyWithCompletionHandler:nil];
}
(OP通过问题中的编辑回答。转换为社区wiki答案。请参阅)
OP写道:
我解决了我的问题
对于那些和我有同样问题的人,这里有一个简单的解决方案:
a.删除以下代码:
b.(可选)重写完成处理程序:
c。然后等待足够长的时间,让程序完成编写。
谢谢@user1192409。这篇文章对我很有帮助。只有一个问题需要知道写作什么时候结束。嗨,你能帮我吗?我已经使用了这个代码,但无法在合并文件中获得视频。我可以获取assetSession的AVAssetExportSessionStatusCompleted状态,但无法查看视频。我已经检查了我的视频文件,它是正确的。。而且我的音频文件是正确的。。。但当合并两个视频时,不会显示。。。。你能告诉我有什么问题吗??
CMTime start=CMTimeMake(0, 600);
CMTime duration=CMTimeMake(600, 600);
CMTimeRange range=CMTimeRangeMake(start, duration);
exporter.timeRange=range;
[exporter exportAsynchronouslyWithCompletionHandler:^{
switch ([exporter status]) {
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed: %@", [[exporter error] localizedDescription]);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
break;
default:
break;
}
}];