Ich habe ein seltsames Problem. In meiner App kombiniere ich mehrere Audio- und Videodateien mit dem unten stehenden Code. Das resultierende Video scheint gut zu funktionieren, sobald ich es vom Gerät auf den Computer heruntergeladen und mit Quick Time abgespielt habe, aber immer wenn ich versuche, das neu zusammengesetzte Video mit UIWebView oder AVPlayer abzuspielen, kann ich nur den ersten Teil der zusammengefügten Videodateien sehen.Komponieren von Video und Audio mit AVMutableComposition
Außerdem, wenn ich versuchte, MPMoviePlayerController zu spielen, hängt es auf "Laden".
Ich kann Audio für alle Komposition hören. Um es klar zu machen, habe ich zwei Arrays: 1- audioPieces mit Pfaden zu Audio-Dateien [song1, song2, song3]; 2- moviePieces mit Pfaden zu Videodateien [movie1, movie2, movie3]; Nach dem Zusammenführen dieser Dateien kann ich nur Film1 sehen, aber ich kann Song1 + Song2 + Song3 hören. P.S. Lieder und Filme haben unterschiedliche Längen (weniger als 0,2 Sekunden Unterschied). Jede Hilfe wird geschätzt. Vielen Dank im Voraus, Janusz
-(void)putFilesTogether{
AVMutableComposition *mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *videoCompositionTrack =[[AVMutableCompositionTrack alloc]init];
AVMutableCompositionTrack *audioCompositionTrack =[[AVMutableCompositionTrack alloc]init];
NSLog(@" movie %@ audio %@ ", moviePieces, audioPieces);
NSError * error;
for(int i=0;i<moviePieces.count;i++)
{
NSFileManager * fm = [NSFileManager defaultManager];
NSString * movieFilePath;
NSString * audioFilePath;
movieFilePath = [moviePieces objectAtIndex:i];
audioFilePath = [audioPieces objectAtIndex:i];
if(![fm fileExistsAtPath:movieFilePath]){
NSLog(@"Movie doesn't exist %@ ",movieFilePath);
}
else{
NSLog(@"Movie exist %@ ",movieFilePath);
}
if(![fm fileExistsAtPath:audioFilePath]){
NSLog(@"Audio doesn't exist %@ ",audioFilePath);
}
else{
NSLog(@"Audio exists %@ ",audioFilePath);
}
NSURL *videoUrl = [NSURL fileURLWithPath:movieFilePath];
NSURL *audioUrl = [NSURL fileURLWithPath:audioFilePath];
AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
AVAssetTrack *videoAssetTrack= [[videoasset tracksWithMediaType:AVMediaTypeVideo] lastObject];
AVURLAsset *audioasset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVAssetTrack *audioAssetTrack= [[audioasset tracksWithMediaType:AVMediaTypeAudio] lastObject];
videoCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
audioCompositionTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
CMTime tempTime = mixComposition.duration;
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioasset.duration) ofTrack:audioAssetTrack atTime:tempTime error:&error];
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofTrack:videoAssetTrack atTime:tempTime error:&error];
if(error)
{
NSLog(@"Ups. Something went wrong! %@", [error debugDescription]);
}
}
NSDate *now = [NSDate dateWithTimeIntervalSinceNow:0];
NSString *caldate = [now description];
float ran = arc4random()%1000;
NSString * pathToSave = [NSString stringWithFormat:@"Output%@%f.mp4",caldate,ran];
pathToSave =[DOCUMENTS_FOLDER stringByAppendingPathComponent:pathToSave];
NSURL *movieUrl = [NSURL fileURLWithPath:pathToSave];
AVAssetExportSession *exporter =[[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetPassthrough];
exporter.outputFileType=AVFileTypeQuickTimeMovie;
exporter.outputURL=movieUrl;
exporter.shouldOptimizeForNetworkUse=YES;
CMTimeValue val = mixComposition.duration.value;
CMTime start=CMTimeMake(0, 600);
CMTime duration=CMTimeMake(val, 600);
CMTimeRange range=CMTimeRangeMake(start, duration);
exporter.timeRange=range;
[exporter exportAsynchronouslyWithCompletionHandler:^{
switch ([exporter status]) {
case AVAssetExportSessionStatusFailed:{
NSLog(@"Export failed: %@ %@", [[exporter error] localizedDescription],[[exporter error]debugDescription]);
NSString * message = @"Movie wasn't created. Try again later.";
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO];
break;}
case AVAssetExportSessionStatusCancelled:{ NSLog(@"Export canceled");
NSString * message1 = @"Movie wasn't created. Try again later.";
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message1 waitUntilDone:NO];
break;}
case AVAssetExportSessionStatusCompleted:
{
NSString * message = @"Movie was successfully created.";
CMTime duration = mixComposition.duration;
[self saveData:duration ofPath:pathToSave];
[self cleanFiles];
[self performSelectorOnMainThread:@selector(dismissMe:) withObject:message waitUntilDone:NO];
}
}}];
}
Ich bin nur eine einzelne Audio/Video-Datei zusammenführen. Das Problem ist, dass meine Videodatei von 40 Sekunden und Audiodatei von 28 Sekunden ist. Also für die restlichen 12 (40-28) Sekunden - Ich möchte es aus 0 Sekunden in Audiodatei wiederholen. Wie mache ich das? Gibt es einen direkten Weg, dies zu tun? – Hemang