Das Hinzufügen von Textuntertiteln zur Videospur (in Swift) schlägt mit dem Fehlercode -11841 fehl.
Ich habe seit einiger Zeit Probleme damit, Videos mit Untertiteln zu versehen. Ich habe einige Links hinzugefügt, auf die ich im Detail verwiesen habe, aber sie helfen nicht.
Im folgenden Code versuche ich, einem Video einen Untertitel hinzuzufügen. Der Ausgabedateipfad lautet wie folgt:
file:///var/mobile/Applications/03E49B29-1070-4541-B7CB-B1366732C179/Documents/output_movie.mov
Außerdem wurde die Eingabedatei mit einem Aufruf von UIPickerView in derselben Anwendung unter dem folgenden temporären Pfad aufgezeichnet:
file:///private/var/mobile/Applications/03E49B29-1070-4541-B7CB-B1366732C179/tmp/capture/capturedvideo.MOV
Der Fehler, den ich erhalte, ist wie folgt:
Error:-
Domain=AVFoundationErrorDomain Code=-11841 "Operation Stopped" UserInfo=0x15ebcfb0 {NSLocalizedDescription=Operation Stopped, NSLocalizedFailureReason=The video could not be composed.}
Description:-
<AVAssetExportSession: 0x15d97c80, asset = <AVMutableComposition: 0x15d788d0 tracks = ("<AVMutableCompositionTrack: 0x15d86910 trackID = 1, mediaType = vide, editCount = 1>")>, presetName = AVAssetExportPresetHighestQuality, outputFileType = com.apple.quicktime-movie
Completed merging the video with status code 4
Der Code, den ich verwende, ist wie folgt. Ich verwende es unter iOS 7.1.2 auf einem iPhone 4s.
class func mergeVideoWithTheme(outputUrl: NSURL, inputVideoUrl videoUrl: NSURL!, onComplete completionHandler: ((Int) -> ())!) -> Void {
// 1. mergeComposition adds all the AVAssets
var mergeComposition : AVMutableComposition = AVMutableComposition()
var trackVideo : AVMutableCompositionTrack = mergeComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID())
//var trackAudio : AVMutableCompositionTrack = mergeComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())
// 2. Add a bank for theme insertion later
//trackVideo.insertTimeRange(range, ofTrack: VideoHelper.Static.blankTrack, atTime: kCMTimeZero, error: nil)
// 3. Source tracks
let sourceAsset = AVURLAsset(URL: videoUrl, options: nil)
let sourceDuration = CMTimeRangeMake(kCMTimeZero, sourceAsset.duration)
let vtrack: AVAssetTrack? = sourceAsset.tracksWithMediaType(AVMediaTypeVideo)[0] as? AVAssetTrack
let atrack: AVAssetTrack? = sourceAsset.tracksWithMediaType(AVMediaTypeAudio)[0] as? AVAssetTrack
if (vtrack == nil) {
return
}
let renderWidth = vtrack?.naturalSize.width
let renderHeight = vtrack?.naturalSize.height
let insertTime = kCMTimeZero
let endTime = sourceAsset.duration
let range = sourceDuration
// append tracks
trackVideo.insertTimeRange(sourceDuration, ofTrack: vtrack, atTime: insertTime, error: nil)
//if(atrack > 0){
// trackAudio.insertTimeRange(sourceDuration, ofTrack: atracks[0] as AVAssetTrack, atTime: insertTime, error: nil)
//}
// 4. Add subtitles (we call it theme)
var themeVideoComposition : AVMutableVideoComposition = AVMutableVideoComposition(propertiesOfAsset: sourceAsset)
// 4.1 - Create AVMutableVideoCompositionInstruction
let mainInstruction: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction()
mainInstruction.timeRange = range
// 4.2 - Create an AVMutableVideoCompositionLayerInstruction for the video track and fix the orientation.
let videolayerInstruction : AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction()
videolayerInstruction.setTransform(trackVideo.preferredTransform, atTime: insertTime)
videolayerInstruction.setOpacity(0.0, atTime: endTime)
// 4.3 - Add instructions
mainInstruction.layerInstructions = NSArray(array: [videolayerInstruction])
themeVideoComposition.renderScale = 1.0
themeVideoComposition.renderSize = CGSizeMake(renderWidth!, renderHeight!)
themeVideoComposition.frameDuration = CMTimeMake(1, 30)
themeVideoComposition.instructions = NSArray(array: [mainInstruction])
// add the theme
// setup variables
// add text
let title = String("Testing this subtitle")
var titleLayer = CATextLayer()
titleLayer.string = title
titleLayer.frame = CGRect(x: 0, y: 0, width: renderWidth!, height: renderHeight!)
let fontName: CFStringRef = "Helvetica-Bold"
let fontSize = CGFloat(36)
titleLayer.font = CTFontCreateWithName(fontName, fontSize, nil)
titleLayer.alignmentMode = kCAAlignmentCenter
titleLayer.foregroundColor = UIColor.whiteColor().CGColor
var backgroundLayer = CALayer()
backgroundLayer.frame = CGRect(x: 0, y: 0, width: renderWidth!, height: renderHeight!)
backgroundLayer.masksToBounds = true
backgroundLayer.addSublayer(titleLayer)
// 2. set parent layer and video layer
var parentLayer = CALayer()
var videoLayer = CALayer()
parentLayer.frame = CGRect(x: 0, y: 0, width: renderWidth!, height: renderHeight!)
videoLayer.frame = CGRect(x: 0, y: 0, width: renderWidth!, height: renderHeight!)
parentLayer.addSublayer(backgroundLayer)
parentLayer.addSublayer(videoLayer)
// 3. make animation
themeVideoComposition.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAsVideoLayer: videoLayer, inLayer: parentLayer)
// Remove the file if it already exists (merger does not overwrite)
let fileManager = NSFileManager.defaultManager()
fileManager.removeItemAtURL(outputUrl, error: nil)
// export to output url
var exporter = AVAssetExportSession(asset: mergeComposition, presetName: AVAssetExportPresetHighestQuality)
exporter.outputURL = outputUrl
exporter.videoComposition = themeVideoComposition
exporter.outputFileType = AVFileTypeQuickTimeMovie
exporter.shouldOptimizeForNetworkUse = true
exporter.exportAsynchronouslyWithCompletionHandler({
if (exporter.error != nil) {
println("Error")
println(exporter.error)
println("Description")
println(exporter.description)
}
completionHandler(exporter.status.rawValue)
})
}
Ich würde mich sehr über Ihre Hilfe freuen. Ich habe keine schnellen Beispiele für das Hinzufügen von Animationen zu den Videos gefunden. Ich frage mich, ob es bei Swift für jemanden funktioniert hat.
Referenzen: (1)https: //gist.github.com/SheffieldKevin/c01789ccff2b2a87f5e (2)http: //www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-video