หมายเหตุสำหรับคำถามด้านล่าง: เนื้อหาทั้งหมดอยู่ในเครื่องของอุปกรณ์ - ไม่มีการสตรีมเครือข่ายเกิดขึ้น วิดีโอมีแทร็กเสียง
ฉันกำลังทำงานกับแอปพลิเคชัน iOS ที่ต้องเล่นไฟล์วิดีโอโดยมีความล่าช้าน้อยที่สุดเพื่อเริ่มคลิปวิดีโอที่เป็นปัญหา น่าเสียดายที่เราไม่ทราบว่าจะมีคลิปวิดีโอใดต่อไปจนกว่าเราจะต้องเริ่มต้นจริง โดยเฉพาะ: เมื่อวิดีโอหนึ่งกำลังเล่นเราจะรู้ว่าชุดต่อไปของคลิปวิดีโอ 10 คลิป (โดยประมาณ) คืออะไร แต่เราไม่รู้ว่าอันไหนกันแน่จนกว่าจะถึงเวลา "ทันที" ที่จะเล่นคลิปถัดไป
สิ่งที่ฉันได้ทำเพื่อดูความล่าช้าในการเริ่มต้นจริงคือการโทรหาaddBoundaryTimeObserverForTimes
โปรแกรมเล่นวิดีโอโดยมีช่วงเวลาหนึ่งมิลลิวินาทีเพื่อดูว่าวิดีโอเริ่มเล่นจริงเมื่อใดและฉันใช้ความแตกต่างของการประทับเวลานั้นกับครั้งแรกใน รหัสที่ระบุว่าจะเริ่มเล่นเนื้อหาใด
จากสิ่งที่ฉันได้เห็นมาจนถึงตอนนี้ฉันพบว่าการใช้การรวมกันของการAVAsset
โหลดและจากนั้นสร้างAVPlayerItem
จากนั้นเมื่อพร้อมแล้วรอAVPlayerStatusReadyToPlay
ก่อนที่ฉันจะเรียกเล่นมีแนวโน้มที่จะใช้เวลาระหว่าง 1 ถึง 3 วินาทีในการเริ่ม คลิป.
ตั้งแต่นั้นมาฉันได้เปลี่ยนไปใช้สิ่งที่ฉันคิดว่าเทียบเท่าโดยประมาณนั่นคือการโทร[AVPlayerItem playerItemWithURL:]
และรอAVPlayerItemStatusReadyToPlay
ให้เล่น ประสิทธิภาพใกล้เคียงกัน
สิ่งหนึ่งที่ฉันสังเกตคือการโหลดรายการ AVPlayer ครั้งแรกช้ากว่าที่เหลือ ดูเหมือนว่าแนวคิดอย่างหนึ่งคือการเปิดเครื่อง AVPlayer ล่วงหน้าด้วยเนื้อหาสั้น / ว่างเปล่าก่อนที่จะลองเล่นวิดีโอแรกอาจเป็นแนวทางปฏิบัติที่ดี [ เริ่มช้าสำหรับ AVAudioPlayer ในครั้งแรกที่เล่นเสียง
ฉันอยากจะลดเวลาเริ่มต้นของวิดีโอให้มากที่สุดและมีแนวคิดบางอย่างที่จะทดลอง แต่ต้องการคำแนะนำจากใครก็ได้ที่อาจช่วยได้
อัปเดต: แนวคิดที่ 7 ด้านล่างเมื่อนำไปใช้จะให้เวลาในการเปลี่ยนประมาณ 500 มิลลิวินาที นี่เป็นการปรับปรุง แต่ก็เป็นการดีที่จะทำให้เร็วขึ้นกว่านี้
แนวคิดที่ 1: ใช้ N AVPlayers (ใช้ไม่ได้)
ใช้อAVPPlayer
อบเจ็กต์~ 10 รายการและเริ่มและหยุดคลิปทั้งหมด ~ 10 คลิปและเมื่อเรารู้ว่าอันไหนที่เราต้องการจริงๆให้เปลี่ยนไปใช้และยกเลิกการหยุดชั่วคราวที่ถูกต้องAVPlayer
และเริ่มต้นใหม่อีกครั้งสำหรับรอบถัดไป
ฉันไม่คิดว่าจะได้ผลเพราะฉันอ่านมาแล้วว่าAVPlayer's
iOS มีขีด จำกัด 4 อย่าง มีคนถามเกี่ยวกับเรื่องนี้ใน StackOverflow ที่นี่และพบเกี่ยวกับขีด จำกัด 4 AVPlayer: การสลับอย่างรวดเร็วระหว่างวิดีโอโดยใช้ avfoundation
แนวคิด 2: ใช้ AVQueuePlayer (ใช้ไม่ได้)
ฉันไม่เชื่อว่าการยัด 10 AVPlayerItems
ลงไปAVQueuePlayer
จะโหลดไว้ล่วงหน้าทั้งหมดเพื่อการเริ่มต้นที่ราบรื่น AVQueuePlayer
เป็นคิวและฉันคิดว่ามันทำให้วิดีโอถัดไปในคิวพร้อมสำหรับการเล่นทันที ฉันไม่รู้ว่าเราอยากจะเล่นวิดีโอไหนใน ~ 10 เรื่องจนกว่าจะถึงเวลาเริ่มเล่น iOS-AVPlayer-วิดีโอพรีโหลด
แนวคิด 3: โหลดเล่นและเก็บไว้AVPlayerItems
ในพื้นหลัง (ยังไม่แน่ใจ 100% - แต่ดูไม่ดี)
ฉันกำลังดูว่าจะมีประโยชน์อะไรในการโหลดและเล่นวินาทีแรกของแต่ละคลิปวิดีโอในพื้นหลัง (หยุดการแสดงผลวิดีโอและเสียง) และให้อ้างอิงถึงแต่ละรายการAVPlayerItem
และเมื่อเรารู้ว่าจะต้องเล่นรายการใด จริงสลับอันนั้นและสลับ AVPlayer พื้นหลังกับอันที่ใช้งานอยู่ ล้างและทำซ้ำ
ทฤษฏีคือผู้เล่นที่เพิ่งเล่นAVPlayer/AVPlayerItem
อาจยังคงมีทรัพยากรที่เตรียมไว้ซึ่งจะทำให้การเล่นครั้งต่อ ๆ ไปเร็วขึ้น จนถึงตอนนี้ฉันยังไม่เห็นประโยชน์จากสิ่งนี้ แต่ฉันอาจAVPlayerLayer
ตั้งค่าพื้นหลังไม่ถูกต้อง ฉันสงสัยว่านี่จะช่วยปรับปรุงสิ่งต่างๆจากที่ฉันเคยเห็น
แนวคิด 4: ใช้รูปแบบไฟล์อื่น - อาจจะโหลดเร็วกว่า
ฉันกำลังใช้รูปแบบ H.264 ของ. m4v (video-MPEG4) H.264 มีตัวเลือกตัวแปลงสัญญาณที่แตกต่างกันมากมายดังนั้นจึงเป็นไปได้ว่าบางตัวเลือกจะค้นหาได้เร็วกว่าตัวเลือกอื่น ๆ ฉันพบว่าการใช้การตั้งค่าขั้นสูงที่ทำให้ขนาดไฟล์เล็กลงจะเพิ่มเวลาในการค้นหา แต่ไม่พบตัวเลือกใด ๆ ที่ไปในทางอื่น
แนวคิดที่ 5: การผสมผสานระหว่างรูปแบบวิดีโอแบบไม่สูญเสียข้อมูล + AVQueuePlayer
หากมีรูปแบบวิดีโอที่โหลดเร็ว แต่อาจจะเป็นที่ที่ขนาดไฟล์เสียไปแนวคิดหนึ่งก็คือเตรียม 10 วินาทีแรกของคลิปวิดีโอแต่ละคลิปไว้ล่วงหน้าด้วยเวอร์ชันที่ป่อง แต่โหลดเร็วขึ้น แต่กลับ ที่ขึ้นกับเนื้อหาที่เข้ารหัสใน H.264 ใช้ AVQueuePlayer และเพิ่ม 10 วินาทีแรกในรูปแบบไฟล์ที่ไม่มีการบีบอัดและตามด้วยไฟล์ที่อยู่ใน H.264 ซึ่งจะใช้เวลาเตรียม / โหลดล่วงหน้าสูงสุด 10 วินาที ดังนั้นฉันจะได้รับ 'สิ่งที่ดีที่สุด' จากทั้งสองโลก: เวลาเริ่มต้นที่รวดเร็ว แต่ยังได้รับประโยชน์จากรูปแบบที่กะทัดรัดกว่าด้วย
แนวคิดที่ 6: ใช้ AVPlayer ที่ไม่ได้มาตรฐาน / เขียนของฉันเอง / ใช้ของคนอื่น
ด้วยความต้องการของฉันฉันอาจไม่สามารถใช้ AVPlayer ได้ แต่ต้องหันไปใช้ AVAssetReader และถอดรหัสในสองสามวินาทีแรก (อาจเขียนไฟล์ดิบลงดิสก์) และเมื่อพูดถึงการเล่นให้ใช้รูปแบบดิบเพื่อเล่น กลับเร็ว ดูเหมือนจะเป็นโครงการใหญ่สำหรับฉันและถ้าฉันทำแบบไร้เดียงสามันก็ไม่ชัดเจน / ไม่น่าจะทำได้ดีกว่านี้ เฟรมวิดีโอที่ถอดรหัสและไม่บีบอัดแต่ละเฟรมมีขนาด 2.25 MB พูดอย่างไร้เดียงสา - ถ้าเราใช้ ~ 30 fps สำหรับวิดีโอฉันจะจบลงด้วยข้อกำหนดการอ่านจากดิสก์ ~ 60 MB / s ซึ่งอาจเป็นไปไม่ได้ / ผลักดันมัน เห็นได้ชัดว่าเราต้องทำการบีบอัดภาพในระดับหนึ่ง (อาจเป็นรูปแบบการบีบอัด openGL / es เนทีฟผ่าน PVRTC) ... อาจจะมีห้องสมุดที่ฉันสามารถใช้?
แนวคิด 7: รวมทุกอย่างไว้ในเนื้อหาภาพยนตร์เรื่องเดียวและ askToTime
แนวคิดหนึ่งที่อาจง่ายกว่าข้อใดข้อหนึ่งคือการรวมทุกอย่างไว้ในภาพยนตร์เรื่องเดียวและใช้ askToTime สิ่งนี้คือเราจะกระโดดไปรอบ ๆ สถานที่ เข้าถึงภาพยนตร์โดยสุ่มเป็นหลัก ฉันคิดว่าสิ่งนี้อาจใช้งานได้จริง: avplayer-movie-playing-lag-in-ios5
แนวทางใดที่คุณคิดว่าดีที่สุด จนถึงตอนนี้ฉันยังไม่มีความคืบหน้ามากนักในแง่ของการลดความล่าช้า