Извлечь аудио из видео файла

Как я могу извлечь аудио из видео файлаwithout using FFmpeg?

Я хочу использоватьAVMutableComposition а такжеAVURLAsset для решения этого, например преобразование из .mov в .m4a файл.

 Michael Dautermann12 июл. 2012 г., 14:22
Насколько я знаю, AVFoundation на iOS знаетnothing о том, как декодировать или открыть & quot;.flv& Quot; файлы, так что этот вопрос не для начала. Вот почему вам нужно использовать какую-нибудь стороннюю библиотеку, такую как ffmpeg или что-то еще, чтобы открыть файл .flv и преобразовать его во что-то, из чего вы сможете правильно использовать.
 iPhone Developer12 июл. 2012 г., 14:25
Я отредактирую пример, так как не думал об этом ... но мое требование остается прежним .. :(

Ответы на вопрос(2)

Во всех мультимедийных форматах аудио кодируется отдельно от видео, а их кадры чередуются в файле. Таким образом, удаление видео из мультимедийного файла не требует никаких действий с кодировщиками и декодерами: вы можете написать анализатор форматов файлов, который будет отбрасывать видео дорожку, без использования мультимедийных API на телефоне.

Чтобы сделать это без использования сторонней библиотеки, вам нужно написать анализатор с нуля, который может быть простым или сложным в зависимости от формата файла, который вы хотите использовать. Например, FLV очень прост, поэтому удаление дорожки из него очень просто (просто пройдите по потоку, определите начало кадра и отбросьте «0x09» = видеокадры). MP4 немного сложнее, его заголовок (MOOV) имеет иерархическую структуру, в которой у вас есть заголовки для каждой дорожки (атомы TRAK). Вам нужно отбросить видео TRAK, а затем скопировать перемеженный атом битового потока (MDAT), пропуская все кластеры видеоданных при копировании.

Кроме ffmpeg вы можете использовать сторонние библиотеки. На ум приходит GPAC MP4BOX (лицензия LGPL). Если LGPL является проблемой, есть много коммерческих SDK, которые вы можете использовать.

 iPhone Developer25 июл. 2012 г., 06:49
Ок, спасибо большое ..
 24 июл. 2012 г., 11:03
Какой формат файла?
 iPhone Developer24 июл. 2012 г., 11:04
.mov to .m4a ???
 24 июл. 2012 г., 16:06
Извините ... MOV (аналог MP4) - это сложный формат файла, написание такого синтаксического анализатора занимает как минимум день или два, поэтому я не могу вам с этим помочь. Я предполагаю, что ваша первоначальная идея сделать это с помощью AVMutableComposition - лучший способ (он должен делать то же самое) - в основном файл M4A почти аналогичен MOV без звуковой дорожки, поэтому откройте MOV как AVMutableComposition и выполните removeTrack. может сделать трюк ...
 iPhone Developer24 июл. 2012 г., 10:54
Спасибо за ваш ответ .. +1 за это .. но если бы вы могли помочь мне с кодированием ... это было бы очень полезно :)
Решение Вопроса

Следующий код Swift 3 показывает, как извлечь аудио из файла фильма (.mov) и преобразовать его в аудиофайл (.m4a) используяAVURLAsset, AVMutableComposition а также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, preferredTrackID: 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)
            }
        }
    }

}

Ваш ответ на вопрос