我用Swift写了一个程序。我想合并一个视频和一个音频文件,但是得到了这个错误。
失败错误域=AVFoundationErrorDomain代码=-11838“操作停止”用户信息= 0x 17 da 4230 {NSLocalizedDescription=操作停止,NSLocalizedFailureReason=该媒体不支持该操作。}
代码
func mergeAudio(audioURL: NSURL, moviePathUrl: NSURL, savePathUrl: NSURL) {
var composition = AVMutableComposition()
let trackVideo:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
let trackAudio:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
let option = NSDictionary(object: true, forKey: "AVURLAssetPreferPreciseDurationAndTimingKey")
let sourceAsset = AVURLAsset(URL: moviePathUrl, options: option as [NSObject : AnyObject])
let audioAsset = AVURLAsset(URL: audioURL, options: option as [NSObject : AnyObject])
let tracks = sourceAsset.tracksWithMediaType(AVMediaTypeVideo)
let audios = audioAsset.tracksWithMediaType(AVMediaTypeAudio)
if tracks.count > 0 {
let assetTrack:AVAssetTrack = tracks[0] as! AVAssetTrack
let assetTrackAudio:AVAssetTrack = audios[0] as! AVAssetTrack
let audioDuration:CMTime = assetTrackAudio.timeRange.duration
let audioSeconds:Float64 = CMTimeGetSeconds(assetTrackAudio.timeRange.duration)
trackVideo.insertTimeRange(CMTimeRangeMake(kCMTimeZero,audioDuration), ofTrack: assetTrack, atTime: kCMTimeZero, error: nil)
trackAudio.insertTimeRange(CMTimeRangeMake(kCMTimeZero,audioDuration), ofTrack: assetTrackAudio, atTime: kCMTimeZero, error: nil)
}
var assetExport: AVAssetExportSession = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetPassthrough)
assetExport.outputFileType = AVFileTypeMPEG4
assetExport.outputURL = savePathUrl
self.tmpMovieURL = savePathUrl
assetExport.shouldOptimizeForNetworkUse = true
assetExport.exportAsynchronouslyWithCompletionHandler { () -> Void in
switch assetExport.status {
case AVAssetExportSessionStatus.Completed:
let assetsLib = ALAssetsLibrary()
assetsLib.writeVideoAtPathToSavedPhotosAlbum(savePathUrl, completionBlock: nil)
println("success")
case AVAssetExportSessionStatus.Failed:
println("failed \(assetExport.error)")
case AVAssetExportSessionStatus.Cancelled:
println("cancelled \(assetExport.error)")
default:
println("complete")
}
}
}
在我的想法中,像mpeg4这样的媒体类型是错误的。问题在哪里?我错过了什么?
6条答案
按热度按时间uxh89sit1#
1.* * 合并视频音频+外部音频**(最初的答案是丢弃视频声音)
1.* * 水平翻转视频如果需要的话(当用户使用正面摄像头拍摄时,我个人会使用它,顺便说一句,Instagram也会翻转它)
1.正确应用
preferredTransform
,解决了旋转保存视频时的问题(视频为外部视频:由其他设备捕获/由其他应用程序生成)1.* * 使用VideoComposition删除了一些未使用的代码。
1.已将完成处理程序添加到方法中,以便可以从其他类调用它。
1.更新为Swift 4。
第1步。
第二步。
再次感谢@Govind的回答!它帮了我很多!
希望这个更新也能帮助到一些人:)
rta7y2nd2#
在上面的问题相同的错误,我发现由于错误的savePathUrl,目标URL应该像下面的代码,包括新的视频名称。
注:这是测试和100%工作代码为我。
Stap:1将这些模块导入到viewController中。
步骤2:在代码中添加此函数
第三步:像这样调用你想要的函数
希望这对你有帮助,保存你时间。
jm2pwxwz3#
斯威夫特4.2 / 5
8fq7wneg4#
带有URL和新语法的Swift3版本。
e5njpo685#
Swift 5版本(如果视频大于音频,则还重复音频):只是通过音频和视频网址。我已经尝试了本地视频和远程音频网址。
sd2nnvve6#
针对Swift并发进行了更新(Swift 5.7)
要引发的一些错误:
和方法: