Tengo un archivo de video y un archivo de audio. ¿Es posible fusionarlo a un video con un archivo de sonido? Creo que AVMutableComposition debería ayudarme, pero todavía no entiendo cómo. ¿Algún consejo?Cómo agregar archivos de audio a video en el SDK de iphone
Respuesta
Gracias Daniel. Lo descubrí, es fácil.
AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
atTime:kCMTimeZero error:nil];
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 = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
NSURL *exportUrl = [NSURL fileURLWithPath:exportPath];
if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
{
[[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
}
_assetExport.outputFileType = @"com.apple.quicktime-movie";
DLog(@"file type %@",_assetExport.outputFileType);
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;
[_assetExport exportAsynchronouslyWithCompletionHandler:
^(void) {
// your completion code here
}
}
];
Sí, es posible, aquí hay un fragmento de código que se usa para agregar audio a una composición existente, tomé esto del código de muestra de manzanas, probablemente debería ver todo el proyecto, lo encontrará muy útil, el proyecto es AVEditDemo y puede encontrarlo en el material de WWDC 2010 que publicaron aquí developer.apple.com/videos/wwdc/2010. Esperamos que ayuda
- (void)addCommentaryTrackToComposition:(AVMutableComposition *)composition withAudioMix:(AVMutableAudioMix *)audioMix
{
NSInteger i;
NSArray *tracksToDuck = [composition tracksWithMediaType:AVMediaTypeAudio]; // before we add the commentary
// Clip commentary duration to composition duration.
CMTimeRange commentaryTimeRange = CMTimeRangeMake(self.commentaryStartTime, self.commentary.duration);
if (CMTIME_COMPARE_INLINE(CMTimeRangeGetEnd(commentaryTimeRange), >, [composition duration]))
commentaryTimeRange.duration = CMTimeSubtract([composition duration], commentaryTimeRange.start);
// Add the commentary track.
AVMutableCompositionTrack *compositionCommentaryTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, commentaryTimeRange.duration) ofTrack:[[self.commentary tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:commentaryTimeRange.start error:nil];
NSMutableArray *trackMixArray = [NSMutableArray array];
CMTime rampDuration = CMTimeMake(1, 2); // half-second ramps
for (i = 0; i < [tracksToDuck count]; i++) {
AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[tracksToDuck objectAtIndex:i]];
[trackMix setVolumeRampFromStartVolume:1.0 toEndVolume:0.2 timeRange:CMTimeRangeMake(CMTimeSubtract(commentaryTimeRange.start, rampDuration), rampDuration)];
[trackMix setVolumeRampFromStartVolume:0.2 toEndVolume:1.0 timeRange:CMTimeRangeMake(CMTimeRangeGetEnd(commentaryTimeRange), rampDuration)];
[trackMixArray addObject:trackMix];
}
audioMix.inputParameters = trackMixArray;
}
¿Dónde está esta demo? No puedo encontrar una descarga en ningún lado. –
sí ... ¿dónde está la demo? –
Solo estoy fusionando un solo archivo de audio/video. El problema es que mi archivo de video de 40 segundos y el archivo de audio es de 28 segundos. Entonces, para los 12 (40-28) segundos restantes, quiero repetirlo desde 0 segundos en el archivo de audio. ¿Cómo hago eso? ¿Hay una manera directa de hacer esto? – Hemang
Aquí es la versión rápida:
func mixAudio(audioURL audioURL: NSURL, videoURL: NSURL) {
let audioAsset = AVURLAsset(URL: audioURL)
let videoAsset = AVURLAsset(URL: videoURL)
let mixComposition = AVMutableComposition()
let compositionCommentaryTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
// add audio
let timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
let track = audioAsset.tracksWithMediaType(AVMediaTypeAudio)[0]
do {
try compositionCommentaryTrack.insertTimeRange(timeRange, ofTrack: track, atTime: kCMTimeZero)
}
catch {
print("Error insertTimeRange for audio track \(error)")
}
// add video
let compositionVideoTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
let timeRangeVideo = CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
let trackVideo = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0]
do {
try compositionVideoTrack.insertTimeRange(timeRangeVideo, ofTrack: trackVideo, atTime: kCMTimeZero)
}
catch {
print("Error insertTimeRange for video track \(error)")
}
// export
let assetExportSession = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetPassthrough)
let videoName = "export.mov"
exportPath = "\(NSTemporaryDirectory())/\(videoName)"
let exportURL = NSURL(fileURLWithPath: exportPath!)
if NSFileManager.defaultManager().fileExistsAtPath(exportPath!) {
do {
try NSFileManager.defaultManager().removeItemAtPath(exportPath!)
}
catch {
print("Error deleting export.mov: \(error)")
}
}
assetExportSession?.outputFileType = "com.apple.quicktime-movie"
assetExportSession?.outputURL = exportURL
assetExportSession?.shouldOptimizeForNetworkUse = true
assetExportSession?.exportAsynchronouslyWithCompletionHandler({
print("Mixed audio and video!")
dispatch_async(dispatch_get_main_queue(), {
print(self.exportPath!)
})
})
}
- 1. Agregar audio a video en Android
- 2. cómo reproducir el video de ustream en iphone sdk?
- 3. Transmitir transmisión de video en vivo iPhone SDK de iPhone
- 4. iphone sdk> 3.0. ¿Miniatura de video?
- 5. ¿Puede grabar video/audio en el iPhone mientras reproduce un video por separado (con audio opcionalmente)?
- 6. WP7 Selector de archivos de audio/video
- 7. Cómo combinar archivos de audio y video en Android
- 8. ¿Cómo descargar archivos de audio/video desde Internet y almacenar en la aplicación iPhone?
- 9. Audio en el iPhone
- 10. Conversión de audio y video a NSData
- 11. iPhone SDK: ¿cómo agregar una imagen a un UIBarButton?
- 12. iPhone SDK - ¿Cómo reproducir un video con transparencia?
- 13. Cómo utilizar una unidad de audio en el iPhone
- 14. iPhone - ¿Reproduce un video en OS/SDK 3.0 y 4.0?
- 15. Reproducir archivos MP3 con SDK de iPhone
- 16. Transmisión de audio y video de Android a PC/web.
- 17. .NET Video Audio Chat
- 18. Problemas con Rails 3 Webrick y cargando video para archivos de video iPhone/iPad (mp4 m4v)
- 19. iPhone SDK 3.0 Acceso a la Cámara
- 20. cómo sincronizar audio y video usando xuggler
- 21. Android sdk cortar/recortar archivo de video
- 22. Bucle de audio HTML5 en el iPhone
- 23. Cómo configurar uitableviewclick en el iphone sdk
- 24. descarga de archivos desde UIWebView en iPhone SDK
- 25. Múltiples pistas de audio para video HTML5
- 26. Acceso a metadatos de audio/video con .NET
- 27. Quiero hacer un archivo de video a partir de secuencias de imágenes y archivos de audio
- 28. Combina video y audio con ffmpeg. Pasa el video en bucle mientras el audio no supera el
- 29. iPhone SDK: ¿Cómo se descargan los archivos de video al Directorio de documentos y luego se reproducen?
- 30. Cómo grabar video en iphone
acutually este pedacito de código no funciona correctamente ... cuando implemente este código en mi proyecto, se bloqueará en [compositionCommentaryTrack insertTimeRange: CMTimeRangeMake (kCMTimeZero, audioAsset.duration) ofTrack: [[audioAsset tracksWithMediaType: AVMediaTypeAudio] objectAtIndex: 0] atTime: kCMTimeZero error: nil]; y muestra que no hay ningún objeto en el índice cero .. – Swastik
@Swastik Me encuentro con el mismo problema en ocasiones, especialmente cuando trabajo con archivos de iCloud. La solución para mí ha sido hacer 2 cosas. 1) verifico que el archivo que estoy tratando de usar es válido para el tipo de medios que estoy tratando de usar como y 2) me aseguro de que el archivo realmente tenga datos (que a veces no lo hace con iCloud) – nick
hola Steve, solo estoy fusionando un solo archivo de audio/video. El problema es que mi archivo de video de 40 segundos y el archivo de audio es de 28 segundos. Entonces, para los 12 (40-28) segundos restantes, quiero repetirlo desde 0 segundos en el archivo de audio. ¿Cómo hago eso? ¿Hay una manera directa de hacer esto? – Hemang