#c #swift
Вопрос:
Я хочу выбрать видеофайл mp4 или ts, удалить аудио из файла и поместить новый файл, переименованный в «‘имя файла’-noaudio.mp4», в расположение исходного файла. Это для приложения macOS, использующего Swift 4.0. Начальная часть кода работает самостоятельно, чтобы выбрать файл…. Но я не могу удалить аудио из видеофайла.
РЕДАКТИРОВАТЬ: Мне интересно, является ли частью проблемы использование AVFoundation и UIKit, которые, похоже, не работают с macOS. Я не могу найти замену. Каковы мои варианты?
Я смог выбрать файл с помощью
import Cocoa import Foundation import AVFoundation import UIKit @objc func removeAudio(_ sender: NSMenuItem) {{ let dialog = NSOpenPanel(); dialog.title = "Choose a file"; dialog.showsResizeIndicator = true; dialog.showsHiddenFiles = false; dialog.allowsMultipleSelection = false; dialog.canChooseDirectories = false; dialog.allowedFileTypes = ["ts", "mp4"]; if (dialog.runModal() == NSApplication.ModalResponse.OK) { let result = dialog.url // Pathname of the file if (result != nil) { let _: String = result!.path } } else { // User clicked on "Cancel" return } } func removeAudioFromVideo(videoURL: NSURL, completion: (NSURL?, NSError?) -gt; Void) -gt; Void { let fileManager = NSFileManager.defaultManager() let composition = AVMutableComposition() let sourceAsset = AVURLAsset(URL: videoURL) let compositionVideoTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) let sourceVideoTrack: AVAssetTrack = sourceAsset.tracksWithMediaType(AVMediaTypeVideo)[0] let x = CMTimeRangeMake(kCMTimeZero, sourceAsset.duration) try! compositionVideoTrack.insertTimeRange(x, ofTrack: sourceVideoTrack, atTime: kCMTimeZero) let exportPath : NSString = NSString(format: "%@%@", NSTemporaryDirectory(), "removeAudio.mov") let exportUrl: NSURL = NSURL.fileURLWithPath(exportPath as String) if(fileManager.fileExistsAtPath(exportPath as String)) { try! fileManager.removeItemAtURL(exportUrl) } let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) exporter!.outputURL = exportUrl; exporter!.outputFileType = AVFileTypeQuickTimeMovie exporter?.exportAsynchronouslyWithCompletionHandler({ dispatch_async(dispatch_get_main_queue(), { completion(exporter?.outputURL, nil) }) }) } }