ด้วยการถ่ายทอดสดและวิดีโอสั้นที่เพิ่มขึ้น วิดีโอจึงกลายเป็นวิธีการหลักในการแสดงข้อมูลการปฏิบัติงาน/ผลิตภัณฑ์ เนื่องจากมีข้อมูลจำนวนมาก อย่างไรก็ตาม เนื่องจากความสนใจของผู้ผลิตเบราว์เซอร์ในประเทศหลายราย พวกเขาจึงได้วางข้อจำกัดหลายประการเกี่ยวกับความสามารถด้านวิดีโอของ HTML5 ซึ่งไม่จำกัดเพียง:
สำหรับคำถามเฉพาะ โปรดดูที่ "การใช้งานการขุดวิดีโอเทอร์มินัลบนมือถือของแอนิเมชั่นเฟรมที่ซับซ้อน" ที่เขียนโดยทีมงาน IMWeb ของ Tencent
เพื่อแก้ไขปัญหาเหล่านี้ เราได้นำ WXInlinePlayer มาใช้โดยการถอดรหัส FLV เทคโนโลยีบุคคลที่สามและ API แพลตฟอร์มที่ใช้มีดังนี้:
ในเวลาเดียวกัน เรายังเขียน FLV Demuxer เวอร์ชัน WebAssembly อีกด้วย คุณสามารถค้นหาโค้ดที่เกี่ยวข้องได้ใน lib/codec
การทดสอบความเข้ากันได้ใช้โมเดลที่เกี่ยวข้องซึ่งให้บริการ BrowserStack เพื่อการอ้างอิงเท่านั้น:
https://eroszy.github.io/WXInlinePlayer/example/index.html
โปรดตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งพัสดุ/emscripten 1.38.45/cmake และ make จากนั้นดำเนินการคำสั่งต่อไปนี้:
npm install # 初始化工程
npm update # 更新工程有关的插件。如果网络错误,改用 cnpm update
bash build.sh
ผลิตภัณฑ์ขั้นสุดท้ายจะอยู่ในโฟลเดอร์ตัวอย่าง
โปรดทราบ:
- โปรดสร้างในสภาพแวดล้อม *nix ไม่รับประกันการคอมไพล์ของ OpenH264 ภายใต้ Windows
- โปรดตรวจสอบให้แน่ใจว่า emscripten อยู่ในเวอร์ชัน 1.38.45 ไม่เช่นนั้นจะเกิดข้อผิดพลาด wasm32
- เวอร์ชัน cmake ต้องเป็น 3.16+
<!DOCTYPE html >
< html >
< head >
< meta charset =" UTF-8 " />
< title > WXInlinePlayer </ title >
< style >
* {
margin: 0;
padding: 0;
}
html,
body {
width: 100%;
height: 100%;
}
</ style >
</ head >
< body >
< canvas id =" container " width =" 800 " height =" 450 " > </ canvas >
< script src =" ./index.js " > </ script >
< script >
if ( WXInlinePlayer . isSupport ( ) ) {
WXInlinePlayer . init ( {
asmUrl : './prod.baseline.asm.combine.js' ,
wasmUrl : './prod.baseline.wasm.combine.js'
} ) ;
WXInlinePlayer . ready ( ) . then ( ( ) => {
const player = new WXInlinePlayer ( {
url : 'https://static.petera.cn/mm.flv' ,
$container : document . getElementById ( 'container' ) ,
hasVideo : true ,
hasAudio : true ,
volume : 1.0 ,
muted : false ,
autoplay : true ,
loop : true ,
isLive : false ,
chunkSize : 128 * 1024 ,
preloadTime : 5e2 ,
bufferingTime : 1e3 ,
cacheSegmentCount : 64 ,
customLoader : null
} ) ;
const { userAgent } = navigator ;
const isWeChat = / MicroMessenger / i . test ( userAgent ) ;
if ( ! isWeChat ) {
alert ( 'click to play!' ) ;
document . body . addEventListener ( 'click' , ( ) => {
player . play ( ) ;
} ) ;
}
} ) ;
}
</ script >
</ body >
</ html >
ในไดเร็กทอรีรากของโปรเจ็กต์ ให้ป้อนคำสั่งเพื่อเริ่มต้นเซิร์ฟเวอร์:
npm run serve
จากนั้นป้อน URL เพื่อเข้าถึงการสาธิต:
http://localhost:8888/example/index.html
ไม่ว่าสภาพแวดล้อมการดำเนินการปัจจุบันจะรองรับ WXInlinePlayer หรือไม่
if ( WXInlinePlayer . isSupport ( ) ) {
console . log ( 'WXInlinePlayer support' ) ;
}
ในการเริ่มต้น WXInlinePlayer คุณจะต้องส่งที่อยู่เฉพาะของไลบรารีการถอดรหัส H264 ที่โหลดไว้ สำหรับการเลือกไลบรารีการถอดรหัส โปรดดูที่: วิธีเลือกการพึ่งพาการถอดรหัส
if ( WXInlinePlayer . isSupport ( ) ) {
WXInlinePlayer . init ( {
asmUrl : './prod.baseline.asm.combine.js' ,
wasmUrl : './prod.baseline.wasm.combine.js'
} ) . catch ( e => {
console . log ( `WXInlinePlayer init error: ${ e } ` ) ;
} ) ;
}
WXInlinePlayer พร้อมใช้งานและสามารถเริ่มต้นได้อย่างปลอดภัย
if ( WXInlinePlayer . isSupport ( ) ) {
WXInlinePlayer . init ( { /*.....*/ } ) ;
WXInlinePlayer . ready ( ) . then ( ( ) => {
console . log ( 'WXInlinePlayer ready' ) ;
} ) ;
}
ตัวสร้าง WXInlinePlayer โปรดดูที่: พารามิเตอร์การเริ่มต้นสำหรับพารามิเตอร์การเริ่มต้นที่เกี่ยวข้อง
WXInlinePlayer . ready ( ) . then ( ( ) => {
const player = new WXInlinePlayer ( { /*...*/ } ) ;
} ) ;
สำหรับการเล่นวิดีโอ โปรดทราบว่าเนื่องจากข้อจำกัดของเบราว์เซอร์ (ยกเว้น WeChat และ Chrome เวอร์ชันต่ำกว่า 66) เวอร์ชันที่สูงกว่าจึงได้ปิดใช้งานการเล่นเสียงอัตโนมัติ ดังนั้นการเรียกใช้วิธีนี้โดยตรงอาจไม่ได้ผล โปรดคลิก/touchstart/touchend/touchmove ฯลฯ อนุญาตให้ผู้ใช้ กระตุ้นเหตุการณ์อย่างแข็งขัน
document . body . addEventListener ( 'click' , ( ) => {
player . play ( ) ;
} ) ;
หยุดผู้เล่นทั้งหมดและไม่สามารถเล่นต่อได้
player . stop ( ) ;
หยุดการเล่นปัจจุบันชั่วคราว
player . pause ( ) ;
ดำเนินการดำเนินการที่หยุดชั่วคราวต่อซึ่งเกิดจากการหยุดชั่วคราว
player . resume ( ) ;
รับ/ตั้งค่าระดับเสียงปัจจุบัน
const volume = player . volume ( ) ; // get volume
player . volume ( volume ) ; // set volume
รับ/ตั้งค่าสถานะปิดเสียง
const muted = player . mute ( ) ; // get mute
player . mute ( muted ) ; // set mute
ทำลายเครื่องเล่นและปล่อยหน่วยความจำทั้งหมดเพื่อนำไปรีไซเคิล
player . destroy ( ) ;
รับเวลาเล่นปัจจุบัน โปรดทราบว่าอาจมีค่าลบ ดังนั้นโปรดจัดการด้วยความระมัดระวัง
player . on ( 'timeUpdate' , ( ) => {
let currentTime = player . getCurrentTime ( ) ;
currentTime = currentTime <= 0 ? 0 : currentTime ;
} ) ;
ระยะเวลาที่สามารถเล่นได้สามารถเข้าใจได้ว่าเป็นระยะเวลาบัฟเฟอร์
player . on ( 'timeUpdate' , ( ) => {
const duration = player . getAvaiableDuration ( ) ;
} ) ;
ปัจจุบันมีไลบรารีการถอดรหัสอยู่ 3 ชุด ได้แก่
ความแตกต่างคือ:
เราขอแนะนำให้ใช้ baseline.asm/baseline.wasm เมื่อคุณเล่นวิดีโอโฆษณา/วิดีโอการตลาด/วิดีโอแอนิเมชันขนาดเล็กที่มีความละเอียดอ่อนต่อขนาดของไลบรารีที่ต้องพึ่งพา และใช้เมื่อเล่นวิดีโอตามความต้องการ/วิดีโอสดที่ไม่ละเอียดอ่อน ขนาดของไลบรารีที่ต้องพึ่งพา all.asm/all.wasm
บนเครื่องพัฒนา สำหรับวิดีโอเดียวกัน การใช้งาน WXInlinePlayer และ FFMpeg เช่น Taobao และ Huajiao มีการใช้หน่วยความจำและการใช้งาน CPU ที่คล้ายกัน ประสิทธิภาพโดยรวมของ WXInlinePlayer นั้นดีกว่าโซลูชัน FFMpeg ประมาณ 5-10% ในขณะที่ H265 มีการลดการบล็อก ประสิทธิภาพดีกว่าโซลูชัน FFMpeg ประมาณ 30% ต่อไปนี้เป็นการเปรียบเทียบประสิทธิภาพการเล่น H265:
ความล่าช้าและความล่าช้าของ WXInlinePlayer ส่วนใหญ่มาจากสามแห่ง:
โดยทั่วไป หากสภาพแวดล้อมเครือข่ายของผู้ใช้ดี ก็เป็นเรื่องยากที่จะทำให้เกิดปัญหาคอขวดเนื่องจากการใช้ WebGL ในการเรนเดอร์ (การดำเนินการนั้นง่ายมาก) ซึ่งโดยทั่วไปจะทำให้เกิดความล่าช้าและความล่าช้าอย่างต่อเนื่องเนื่องจากประสิทธิภาพการถอดรหัสแบบซอฟต์ไม่เพียงพอ
เพื่อเพิ่มประสิทธิภาพการหน่วงเวลาที่เกิดจากประสิทธิภาพการถอดรหัสแบบซอฟต์ไม่เพียงพอ โดยทั่วไปเราจะเริ่มจากหลายที่:
ปัจจุบัน WXInlinePlayer สามารถถอดรหัสวิดีโอ 1280x720, อัตราโค้ด 1024 และอัตราเฟรม 24fps บนเครื่องระดับกลางถึงระดับสูงได้ค่อนข้างราบรื่น
เกี่ยวกับพารามิเตอร์วิดีโอที่กล่าวถึงข้างต้น คุณสามารถดูได้ผ่าน FFmpeg:
ffmpeg -i " your.flv "
ที่นี่เราจะให้โปรไฟล์/อัตราเฟรม/อัตราโค้ด/ความละเอียดของแพลตฟอร์มหลักเพื่อใช้อ้างอิง:
แพลตฟอร์ม | พิมพ์ | ความชัดเจน | ประวัติโดยย่อ | อัตราเฟรม | อัตรารหัส | ปณิธาน |
---|---|---|---|---|---|---|
ฟันเสือ | หน้าจอแนวนอน | เอสดี | สูง | ยี่สิบสี่ | 500,000 | 800x450 |
ฟันเสือ | หน้าจอแนวนอน | เอชดี | สูง | ยี่สิบสี่ | 1200k | 1280x720 |
ฟันเสือ | หน้าจอแนวตั้ง | เอชดี | หลัก | 16 | 1280k | 540x960 |
ชีซิว | หน้าจอแนวตั้ง | เอสดี | สูง | 15 | 307k | 204x360 |
ชีซิว | หน้าจอแนวตั้ง | เอชดี | สูง | 15 | 512k | 304x540 |
ชีซิว | หน้าจอแนวตั้ง | ชัดเจนเป็นพิเศษ | พื้นฐาน | 15 | 1440k | 720x1280 |
ติ๊กต๊อก | หน้าจอแนวตั้ง | ค่าเริ่มต้น | สูง | 30 | 1,600,000 (การเปลี่ยนแปลงเพิ่มเติมสำหรับการอ้างอิงเท่านั้น) | 720x1280 |
คนทำงานเร็ว | หน้าจอแนวตั้ง | ค่าเริ่มต้น | สูง | 25 | 2880k (การเปลี่ยนแปลงเพิ่มเติม สำหรับการอ้างอิงเท่านั้น) | 720x1280 |
เราขอแนะนำให้คุณ:
พารามิเตอร์การกำหนดค่าเวลาแฝงต่ำที่ใช้กันทั่วไปของ WXInlinePlayer มีดังนี้ สำหรับการอ้างอิงเท่านั้น โปรดปรับเปลี่ยนตามการกำหนดค่าไฟล์สตรีมสด/ตามความต้องการของคุณ:
{
chunkSize : 128 * 1024 ,
preloadTime : 5e2 ,
bufferingTime : 1e3 ,
cacheSegmentCount : 64 ,
}
ในเวลาเดียวกัน คุณสามารถใช้ เหตุการณ์ประสิทธิภาพ เพื่อกำหนดประสิทธิภาพการถอดรหัสปัจจุบัน จากนั้นแจ้งให้ผู้ใช้และดาวน์เกรดเป็นโซลูชันการสำรองข้อมูลของคุณ (เช่น การเล่นวิดีโอโดยตรง/ภาพนิ่ง/เฟรมลำดับ ฯลฯ):
player . on ( 'performance' , ( { averageDecodeCost , averageUnitDuration } ) => {
const prop = averageUnitDuration / averageDecodeCost ;
if ( prop >= 2.0 ) {
console . log ( 'good performance' ) ;
} else if ( prop < 2.0 && prop >= 1.0 ) {
console . log ( 'ok, thats fine' ) ;
} else {
console . log ( 'bad performance' ) ;
}
} ) ;
ปัจจุบันโซลูชัน FFmpeg มีปัญหาสำคัญหลายประการ อย่างแรกคือขนาดของไลบรารีการถอดรหัสหลังจากลดขนาดแล้วจะมีขนาดประมาณ 2M และ gzip มีขนาดประมาณ 600k ซึ่งเป็นที่ยอมรับไม่ได้สำหรับผลิตภัณฑ์ที่ใส่ใจเกี่ยวกับขนาดของไลบรารีที่ต้องพึ่งพา ประการที่สอง โซลูชันของ FFmpeg นั้นยากที่จะปรับให้เหมาะสมด้วยตัวเอง ตัวอย่างเช่น WXInlinePlayer จะทำการถอดรหัสผู้ปฏิบัติงานหลายคนใน 2.0 ซึ่งมีค่าใช้จ่ายสูงมากในการปรับเปลี่ยนโซลูชันดังกล่าว
สาเหตุของความล่าช้าและความล่าช้านั้นซับซ้อน สำหรับ WXInlinePlayer โดยทั่วไปความเร็วในการถอดรหัสไม่สามารถตามความเร็วการเล่นได้ โปรดดูวิธีลดความล่าช้าและความล่าช้าเพื่อการปรับให้เหมาะสม
ทั้ง iOS และ Android UC มีตอน WebAssembly/ASM.js ดังนั้นจึงไม่รองรับ
โปรดใช้ FFmpeg หรือเครื่องมืออื่นที่คล้ายคลึงกัน นี่คือตัวอย่างคำสั่งง่ายๆ:
ffmpeg -i " your.mp4 " -vcodec libx264 -acodec aac out.flv
ข้อกำหนด FLV ของ WXInlinePlayer เป็นไปตามข้อกำหนดการขยาย FLV ของ Kingsoft หากคุณต้องการทำการเข้ารหัสที่เกี่ยวข้อง คุณสามารถดูแพตช์ FFmpeg ที่เกี่ยวข้องหรือตัวเข้ารหัสที่เขียนโดย Kingsoft