запись видео, как "Говорящий Том" iphone (проблема в добавлении аудио) - PullRequest
0 голосов
/ 30 октября 2011

Мне нужно записать видео приложения, точно похожего на «Говорящий Том». Пользуясь помощью Здесь и Здесь Я сделал снимок экрана и сделал видео, используя эти изображения, но в нем нет звука.

Я записал и звуковые, и видеофайлы по отдельности, но не знаю, как их добавить

Может кто-нибудь сказать мне , как добавить звук к этому видео или , как записать его со звуком .

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 08 мая 2012
-(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 где-нибудь еще вПеред вызовом метода processVideo запрограммируйте его. Затем он объединит ваше аудио с вашим видеофайлом.

Вы также можете решить, где звук начнет воспроизводиться в видео, в соответствии со значением, назначенным для клавиши «startTime» в audioinfoArray,Используя Switch Case, вы можете воспроизводить видео, загружать на Facebook и т. Д. По своему желанию.

0 голосов
/ 30 октября 2011

Приложение iOS не может действительно записывать (используя любой публичный API) звук, который оно само издает. Приложение может генерировать один и тот же звук дважды: один для воспроизведения, другой для потоковой передачи в файл. Вы должны придерживаться только тех звуков, которые вы знаете, как это сделать обоими способами, например, копирование сигналов PCM в буферы и т. Д.

После того как у вас есть дубликат буфера аудиосэмплов, должен быть пример кода о том, как отправить его на AVAssetWriter.

...