Nowa EdycjaTylko pierwszy utwór Odtwarzanie z AVMutableComposition()
już odwoływać
AVMutableComposition - Only Playing First Track (Swift)
ale nie dostarcza odpowiedzi na to, co szukam.
Mam AVMutableComposition()
. Próbuję zastosować wiele AVCompositionTrack
, z jednego rodzaju AVMediaTypeVideo
w tej jednej kompozycji. To dlatego, że używam 2 różne AVMediaTypeVideo
źródeł z różnymi CGSize
„S i preferredTransforms
z AVAsset
” s one pochodzą.
więc jedynym sposobem, aby zastosować swoją określony preferredTransforms
jest dostarczenie ich w 2 różnych torach. Ale z jakiegoś powodu tylko pierwszy utwór faktycznie dostarczy dowolny film, prawie tak, jakby drugi utwór nigdy nie był dostępny.
Więc próbowałem
1) za pomocą AVMutableVideoCompositionLayerInstruction
„s i stosowaniu AVVideoComposition
wraz z AVAssetExportSession
, która działa w porządku, jestem nadal pracuje na transformacji, ale jest do-stanie. Ale czas przetwarzania wideo jest DOBRZE PONAD 1 minutę, co nie ma zastosowania w mojej sytuacji.
2) Korzystanie z wielu ścieżek, bez AVAssetExportSession
i 2. torze tego samego typu nie pojawi. Teraz mogę umieścić wszystko na 1 ścieżce, ale wszystkie filmy będą miały ten sam rozmiar i preferredTransform jak pierwsze wideo, którego absolutnie nie chcę, ponieważ rozciąga je na wszystkie strony.
Więc moje pytanie brzmi, czy jest możliwe
1) instrukcje Stosując tylko tor bez użycia AVAssetExportSession
? // Preferowany sposób BY FAR.
2) Zmniejszenie czasu eksportu? (Próbowałem użyć PresetPassthrough
, ale nie możesz tego użyć, jeśli masz exporter.videoComposition
, gdzie są moje instrukcje.) To jedyne miejsce, w którym mogę umieścić instrukcje, nie wiem, czy mogę je umieścić gdzie indziej. to niektóre z moich kodu (bez eksportera, jak nie trzeba nigdzie eksportować czegokolwiek, po prostu robić rzeczy po AVMutableComposition łączy elementy.
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")
}
}
}
}
Edit
Jabłko stwierdza, że „Wskazuje instrukcje do kompozycji wideo poprzez NSArray wystąpień klas implementujących protokół AVVideoCompositionInstruction. W przypadku pierwszej instrukcji w tablicy timeRange.start musi być mniejszy lub równy najwcześniejszemu czasowi, dla którego zostanie wykonane odtwarzanie lub inne przetwarzanie (należy pamiętać, że zwykle będzie to kCMTimeZero). W przypadku kolejnych instrukcji timeRange.start musi być równy czasowi zakończenia poprzedniej instrukcji. Czas zakończenia ostatnia instrukcja musi być większa lub równa najnowszemu czasowi, dla którego będzie podejmowane odtwarzanie lub inne przetwarzanie (należy pamiętać, że często będzie to czas trwania zasobu, z którym powiązana jest instancja AVVideoComposition)."
To tylko stwierdza, że cała kompozycja musi być warstwowa wewnątrz instrukcji, jeśli zdecydujesz się użyć DOWOLNE instrukcje (to jest to, co rozumiem). Dlaczego tak jest? Jak po prostu zastosować instrukcje, aby powiedzieć ścieżkę 2 na tym przykładzie bez uwzględnienia zmieniających się utwór 1 lub 3 w ogóle.
tor 1 z 0 - 10s, track 2 z 10 - 20sekund, track 3 z 20 - 30sek
Wszelkie wyjaśnienia na które prawdopodobnie odpowiedzieć na moje pytanie (jeśli jest to wykonalne)
Kiedy mówisz, że drugi utwór nigdy tam nie jest, czy masz na myśli, że widzisz tło kompozycji, czy też paliback zatrzymuje się tuż po pierwszym utworze? –
Mam na myśli, że pierwszy utwór jest odtwarzany, przechodzi w tryb BLANK, a po ukończeniu drugiego utworu wraca do pierwszego utworu – impression7vx
Jaką transformację stosuje się do drugiego utworu? Może znajduje się poza ramką wideoComposition. –