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.
Niestety to nie mój strumień, ale format przesyłania strumieniowego w YouTube DASH, który ma oddzielne wideo i audio. – weiran