2017-04-13 1 views
2

AVMutableComposition에 챕터를 추가하려고합니다. 동영상이 예상대로 생성되어 AVPlayer으로 전송됩니다. (chapter marker 옵션을 AVplayer에 사용하려면) 챕터 마크를 포함하고 싶습니다.AVMutableComposition에 AVTimedMetadataGroup을 추가하여 (임시) 비디오에 챕터 표시 만들기

나는 timed 메타 데이터를 만들기 위해 다음을 시도했다. 그러나 무엇을해야 하는가?

AVMutableComposition에 메타 데이터를 추가하려고하면 모든 메타 데이터 항목이 표시됩니다.

let someAsset:AVURLAsset = AVURLAsset(url:URL(fileURLWithPath: "/tmp/temp.mov")) 
let mutableComposition:AVMutableComposition = AVMutableComposition() 
let start: Int64 = 0 
let duration: Int64 = 500 
let timeRange:CMTimeRange = CMTimeRange(start: CMTime(value: CMTimeValue(start), timescale: 1), end: CMTime(value: CMTimeValue(duration), timescale: 1)); 
var timedMetadataItems: [AVTimedMetadataGroup] = [] 

do { 
    try mutableComposition.insertTimeRange(timeRange, of: someAsset, at: mutableComposition.duration) 


    let metadata = AVMutableMetadataItem() 
    metadata.key = AVMetadataQuickTimeUserDataKeyChapter as NSCopying & NSObjectProtocol 
    metadata.value = "Test" as NSCopying & NSObjectProtocol 

    let timedMetadata = AVTimedMetadataGroup(items: [metadata], timeRange: timeRange) 
    timedMetadataItems.append(timedMetadata) 

} catch let error as NSError { 
    Swift.print(error.localizedDescription) 
} 

return AVPlayerItem(asset: mutableComposition) 

디스크에 작성하지 않고이 일을하는 것이 아니라 좋은 것 장과 함께 동영상을 저장에 도움이 (이상한 느낌인지) 정말 불가능합니다. 나는 정상적인 메타 데이터 만 저장할 수 있습니다.

AVAssetExportSession으로 메타 데이터를 설정하고 파일에 새 컴포지션을 쓸 수는 있지만 AVTimedMetadataGroup을 쓸 수 없습니까?

let export = AVAssetExportSession(asset: mutableComposition, presetName: AVAssetExportPresetPassthrough) 

답변

0

시간 지정 메타 데이터를 컴포지션에 추가 할 수 없다고 생각합니다. 디스크에 쓸 때까지 메모리의 메타 데이터로 작업해야합니다.

시간 지정 메타 데이터를 파일에 쓰는 유일한 방법은 AVAssetWriter입니다.

let formatDesc = aMetadataGroup.copyFormatDescription() 
let metadataInput = AVAssetWriterInput.init(mediaType: .metadata, outputSettings: nil, sourceFormatHint: formatDesc) 
metadataInput.expectsMediaDataInRealTime = false 
writer?.add(metadataInput) 

그런 다음 당신이 metadataAdaptor을 설정하고 metadataInput가 준비 될 때마다 메타 데이터 그룹을 추가 할 것을 사용 는 평소와 같이 자산 작가를 설정하지만 메타 데이터 트랙을 추가 할 필요가이 작업을 수행합니다.

let metadataAdaptor = AVAssetWriterInputMetadataAdaptor.init(assetWriterInput: metadataInput) 
metadataInput.requestMediaDataWhenReady(on: metadataQueue, using: { 
    metadataAdaptor.append(metadataGroup) 
}) 

당신은 메타 데이터 트랙으로 AVAssetReaderOutputMetadataAdaptor를 사용하여 다시이 파일에서 메타 데이터를 검색 할 수 있습니다.