Extraer audio del file de video

¿Cómo puedo eliminar el audio de un file de video sin usar FFmpeg ?

Quiero usar AVMutableComposition y AVURLAsset para resolverlo. Por ejemplo, conversión de .mov a file .m4a.

El siguiente código de Swift 3 muestra cómo extraer audio de un file de película ( .mov ) y convertirlo a un file de audio ( .m4a ) mediante AVURLAsset , AVMutableComposition y AVAssetExportSession :

 import UIKit import AVFoundation class ViewController: UIViewController { @IBAction func extractAudioAndExport(_ sender: UIButton) { // Create a composition let composition = AVMutableComposition() do { let sourceUrl = Bundle.main.url(forResource: "Movie", withExtension: "mov")! let asset = AVURLAsset(url: sourceUrl) guard let audioAssetTrack = asset.tracks(withMediaType: AVMediaTypeAudio).first else { return } let audioCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, prefernetworkingTrackID: kCMPersistentTrackID_Invalid) try audioCompositionTrack.insertTimeRange(audioAssetTrack.timeRange, of: audioAssetTrack, at: kCMTimeZero) } catch { print(error) } // Get url for output let outputUrl = URL(fileURLWithPath: NSTemporaryDirectory() + "out.m4a") if FileManager.default.fileExists(atPath: exportUrl.path) { try? FileManager.default.removeItem(atPath: outputUrl.path) } // Create an export session let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)! exportSession.outputFileType = AVFileTypeAppleM4A exportSession.outputURL = outputUrl // Export file exportSession.exportAsynchronously { guard case exportSession.status = AVAssetExportSessionStatus.completed else { return } DispatchQueue.main.async { // Present a UIActivityViewController to share audio file guard let outputURL = exportSession.outputURL else { return } let activityViewController = UIActivityViewController(activityItems: [outputURL], applicationActivities: []) self.present(activityViewController, animated: true, completion: nil) } } } } 

En todos los formattings multimedia, el audio se codifica por separado del video, y sus frameworks se entrelazan en el file. Por lo tanto, eliminar el video de un file multimedia no requiere ningún problema con los codificadores y decodificadores: puede escribir un analizador de formatting de file que deje caer la pista de video, sin usar las API multimedia en el teléfono.

Para hacer esto sin usar una biblioteca de terceros, debe escribir el analizador desde cero, lo que podría ser simple o difícil según el formatting de file que desee usar. Por ejemplo, FLV es muy simple, por lo que eliminar una pista es muy fácil (simplemente revisa la secuencia, detecta los inicios de la ttwig y suelta el '0x09' = ttwigs de video). MP4 un poco más complejo, su encabezado (MOOV) tiene una estructura jerárquica en la que tiene encabezados para cada una de las pistas (átomos de TRAK). Debe eliminar el video TRAK y copyr el átomo de flujo de bits intercalado (MDAT) omitiendo todos los clústeres de datos de video mientras copy.

Hay bibliotecas de terceros que puedes usar, además de ffmpeg. Uno que viene a la mente es GPAC MP4BOX (licencia LGPL). Si la LGPL es un problema, hay muchos SDK comerciales que puede usar.