以下の新しい編集
すでに参考にしました
AVMutableComposition - 最初のトラックのみを再生する (Swift)
しかし、それは私が探しているものに対する答えを提供していません。
私は持っていAVMutableComposition()
ます。この単一の構成でAVCompositionTrack
単一のタイプのMULTIPLE を適用しようとしています。AVMediaTypeVideo
これは、 と が異なる 2 つの異なるソースを使用しているためAVMediaTypeVideo
です。CGSize
preferredTransforms
AVAsset
そのため、それらの指定を適用する唯一の方法preferredTransforms
は、それらを 2 つの異なるトラックで提供することです。しかし、何らかの理由で、最初のトラックのみが実際にビデオを提供し、2 番目のトラックが存在しないかのようになります。
だから、私は試しました
1) を使用し、 をとともにAVMutableVideoCompositionLayerInstruction
適用すると問題なく動作します。まだ変換に取り組んでいますが、実行可能です。しかし、ビデオの処理時間は 1 分をはるかに超えており、これは私の状況には当てはまりません。AVVideoComposition
AVAssetExportSession
2) 複数のトラックを使用しAVAssetExportSession
、同じタイプの 2 番目のトラックが表示されない。これで、すべてを 1 つのトラックに入れることができますが、すべてのビデオが最初のビデオと同じサイズになり、preferredTransform になります。
だから私の質問は、それは可能ですか
AVAssetExportSession
1) ?を使用せずにトラックだけに命令を適用する //FAR BY 優先される方法。
2) エクスポートの時間を短縮しますか? (使用してみましたが、私の指示がある場所にPresetPassthrough
ある場合は使用できませんexporter.videoComposition
。これは、指示を配置できることがわかっている唯一の場所です。他の場所に配置できるかどうかはわかりません。
ここに私のコードの一部があります(どこにもエクスポートする必要がないため、エクスポーターなしで、AVMutableComposition がアイテムを結合した後に何かを行うだけです。
func merge() {
if let firstAsset = controller.firstAsset, secondAsset = self.asset {
let mixComposition = AVMutableComposition()
let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
//Don't need now according to not being able to edit first 14seconds.
if(CMTimeGetSeconds(startTime) == 0) {
self.startTime = CMTime(seconds: 1/600, preferredTimescale: Int32(600))
}
try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, CMTime(seconds: CMTimeGetSeconds(startTime), preferredTimescale: 600)),
ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0],
atTime: kCMTimeZero)
} catch _ {
print("Failed to load first track")
}
//This secondTrack never appears, doesn't matter what is inside of here, like it is blank space in the video from startTime to endTime (rangeTime of secondTrack)
let secondTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
// secondTrack.preferredTransform = self.asset.preferredTransform
do {
try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, secondAsset.duration),
ofTrack: secondAsset.tracksWithMediaType(AVMediaTypeVideo)[0],
atTime: CMTime(seconds: CMTimeGetSeconds(startTime), preferredTimescale: 600))
} catch _ {
print("Failed to load second track")
}
//This part appears again, at endTime which is right after the 2nd track is suppose to end.
do {
try firstTrack.insertTimeRange(CMTimeRangeMake(CMTime(seconds: CMTimeGetSeconds(endTime), preferredTimescale: 600), firstAsset.duration-endTime),
ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
atTime: CMTime(seconds: CMTimeGetSeconds(endTime), preferredTimescale: 600))
} catch _ {
print("failed")
}
if let loadedAudioAsset = controller.audioAsset {
let audioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: 0)
do {
try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, firstAsset.duration),
ofTrack: loadedAudioAsset.tracksWithMediaType(AVMediaTypeAudio)[0] ,
atTime: kCMTimeZero)
} catch _ {
print("Failed to load Audio track")
}
}
}
}
編集
Apple は次のように述べています。 (これは通常、kCMTimeZero になることに注意してください。) 後続の命令の場合、timeRange.start は、前の命令の終了時間と等しくなければなりません。最後の命令の終了時間は、再生またはその他の最後の時間以上でなければなりません。処理が試行されます (これは多くの場合、AVVideoComposition のインスタンスが関連付けられているアセットの継続時間であることに注意してください)。」
これは、任意の命令を使用することにした場合、構成全体を命令内に階層化する必要があることを示しています (これは私が理解していることです)。どうしてこれなの?トラック 1 または 3 の変更をまったく適用せずに、この例でトラック 2 と言う指示を適用するにはどうすればよいでしょうか。
トラック 1 は 0 ~ 10 秒、トラック 2 は 10 ~ 20 秒、トラック 3 は 20 ~ 30 秒です。
それについての説明は、おそらく私の質問に答えるでしょう(実行可能であれば)。