Как я могу извлечь аудио из видеофайла без использования FFmpeg?
Я хочу использовать AVMutableComposition
и AVURLAsset
для его решения, например. преобразование из файла .mov в файл .m4a.
Как я могу извлечь аудио из видеофайла без использования FFmpeg?
Я хочу использовать AVMutableComposition
и AVURLAsset
для его решения, например. преобразование из файла .mov в файл .m4a.
В следующем коде Swift 5/iOS 12.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: AVMediaType.audio).first else { return }
guard let audioCompositionTrack = composition.addMutableTrack(withMediaType: AVMediaType.audio, preferredTrackID: kCMPersistentTrackID_Invalid) else { return }
try audioCompositionTrack.insertTimeRange(audioAssetTrack.timeRange, of: audioAssetTrack, at: CMTime.zero)
} catch {
print(error)
}
// Get url for output
let outputUrl = URL(fileURLWithPath: NSTemporaryDirectory() + "out.m4a")
if FileManager.default.fileExists(atPath: outputUrl.path) {
try? FileManager.default.removeItem(atPath: outputUrl.path)
}
// Create an export session
let exportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)!
exportSession.outputFileType = AVFileType.m4a
exportSession.outputURL = outputUrl
// Export file
exportSession.exportAsynchronously {
guard case exportSession.status = AVAssetExportSession.Status.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)
}
}
}
}
Во всех мультимедийных форматах аудио кодируется отдельно от видео, а их кадры чередуются в файле. Таким образом, удаление видео из мультимедийного файла не требует возни с кодировщиками и декодерами: вы можете написать анализатор формата файла, который будет удалять видеодорожку, не используя мультимедийные API на телефоне.
Чтобы сделать это без использования сторонней библиотеки, вам нужно написать синтаксический анализатор с нуля, что может быть простым или сложным в зависимости от формата файла, который вы хотите использовать. Например, FLV очень прост, поэтому удалить из него дорожку очень просто (просто пройдитесь по потоку, определите начало кадра и отбросьте «0x09» = видеокадры). MP4 немного сложнее, его заголовок (MOOV) имеет иерархическую структуру, в которой у вас есть заголовки для каждой из дорожек (атомы TRAK). Вам нужно отбросить видео TRAK, а затем скопировать чередующийся атом битового потока (MDAT), пропуская все кластеры видеоданных при копировании.
Помимо ffmpeg, вы можете использовать сторонние библиотеки. На ум приходит GPAC MP4BOX (лицензия LGPL). Если LGPL является проблемой, существует множество коммерческих SDK, которые вы можете использовать.
STCO
(или CO64
) внутри TRAK>MDIA>MINF>STBL
. Длина каждого фрагмента — это еще один расчет, который вам нужно выполнить для информации в файле STBL
. См. эту ссылку.
- person onon15; 09.08.2012
.flv
файлы, поэтому этот вопрос не стоит начинать с самого начала. Вот почему вам нужно использовать стороннюю библиотеку, такую как ffmpeg или что-то еще, чтобы открыть файл .flv и преобразовать его во что-то, что вы можете правильно использовать. - person Michael Dautermann   schedule 12.07.2012