2017-12-23 136 views
9

Obecnie próbuję odtworzyć wideo przy użyciu AVPlayer który ma oddzielne źródło obrazu i dźwięku, więc je połączyć w jeden AVPlayerItem jak poniżej:AVPlayer - odtwarzanie wideo sieci z oddzielnym URL audio bez pobierania plików pierwsze

let videoAsset = AVURLAsset(url: videoURL) 
let audioAsset = AVURLAsset(url: audioURL) 
let duration = videoAsset.duration 
let composition = AVMutableComposition() 

let videoTrack = composition.addMutableTrack(withMediaType: AVMediaType.video, preferredTrackID: kCMPersistentTrackID_Invalid) 
try? videoTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: duration), of: videoAsset.tracks(withMediaType: .video)[0], at: kCMTimeZero) 

let audioTrack = composition.addMutableTrack(withMediaType: .audio, preferredTrackID: kCMPersistentTrackID_Invalid) 
try? audioTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: duration), of: audioAsset.tracks(withMediaType: .audio)[0], at: kCMTimeZero) 

let playerItem = AVPlayerItem(asset: composition) 

Problem polega na tym, że ten kod pobiera całe źródło wideo i audio przez sieć, zanim się zakończy. Zadzwoń do "videoAsset.duration" lub videoTrack.insertTimeRange wyzwala to żądanie sieciowe.

Czy istnieje sposób na użycie AVPlayer do wspólnego odtwarzania osobnych adresów URL audio i wideo (wideo MP4 i audio AAC) bez konieczności pobierania całego pliku?

Zauważyłem, że na moim Macu, Quicktime Player również pobiera plik źródłowy przed rozpoczęciem odtwarzania. Jednak użycie czegoś takiego jak VLC lub IINA nie działa i odtwarzanie może rozpocząć się natychmiast.

Dzięki.

Odpowiedz

2

Dzieje się tak z powodu formatu MP4. Powinieneś rozważyć użycie innego formatu, który jest bardziej stabilny dla przesyłania strumieniowego.

+0

Niestety to nie mój strumień, ale format przesyłania strumieniowego w YouTube DASH, który ma oddzielne wideo i audio. – weiran