เกี่ยวกับ VP8
VP8 เป็นมาตรฐานการบีบอัดสัญญาณภาพอีกแบบหนึ่งครับ ซึ่งว่ากันว่าให้คุณภาพระดับเกือบเทียบเท่า H.264 เลยทีเดียวแต่ไฟล์มีขนาดเล็กกว่า (กี่ % ไม่รู้ครับ) ผู้คิดค้น VP8 คือบริษัท ON2 Technologies ซึ่งต่อมาก็โดน Google ซื้อเลยทำให้ Google เป็นเจ้าของ VP8 ไปโดยปริยายครับ จากนั้นก็เอามาพัฒนาต่อครับ และตอนนี้ VP8 กลายเป็นของฟรีและเป็น Opensource เรียบร้อยแล้วครับ
ไฟล์ Video บน Youtube ที่นามสกุล .webm ก็ใช้ Video Codec แบบ VP8 นี่แหล่ะครับ และว่ากันว่าตอนนี้ Google ก็กำลังแปลงไฟล์เก่าๆที่ใช้ฟอร์แม็ต H.264 ให้เป็น VP8 ด้วยหล่ะครับ
เวลาเราดู Video บน Youtube ภาพจะชัดมากเลยครับ แต่ท่านอย่าเพิ่งดีใจไปนะครับว่าเวลาเอา VP8 มาใช้กับ Video Call, Video Conference แล้วจะได้ภาพชัดขนาดนั้น เป็นไปได้ยากครับ ทั้งนี้ก็เพราะว่าบน Youtube มีการเก็บไฟล์เหล่านั้นไว้ฮาร์ดดิสก์ของเขาแล้ว เวลาเราเปิดดูไฟล์เหล่านั้น ข้อมูลมันไม่ได้แสดงผลบนเครื่องเราทันทีทันใดนะครับ ข้อมูลจะถูกดาวน์โหลดมาเก็บไว้ในเครื่องของเราก่อนเป็นระยะเวลาสั้นๆก่อนแล้วค่อยโชว์จริงๆ มันไม่ได้เป็นแบบ Interactive Realtime นะครับ
แต่กรณี Video Call/Video Conference ของ VoIP มันเป็นแบบ Interactive Realtime ครับ มีการโต้ตอบกันไปๆมาๆ ถึงแม้ว่าจะใช้ VP8 ทำให้ข้อมูลภาพมีขนาดเล็กลงก็ตาม ถ้าใช้บนลิ้งค์ที่มีแบนด์วิดธ์ไม่พอหรือมี Loss คุณภาพที่เห็นก็ "ห่วยรับประทาน" ครับ
** มีลูกค้าหลายท่านที่อาจจะเคยโดนคนขาย Video Conference ยี่ห้อดังๆแพงๆบอกข้อมูลไม่หมด ประมาณว่าถ้าใช้ยี่ห้อนี้จะได้คุณภาพดีสุดยอดแล้วก็เทสให้ดู แต่เทสบนแลนซึ่งมีแบนวิดธ์เหลือเฟือ ลูกค้าก็เห็นว่าจริงสมคำล่ำลือ แต่เวลาเอามาใช้งานผ่านอินเตอร์เน็ตปรากฏว่าบางทีมันก็ดี บางทีมันก็ไม่ดี ภาพล้ม ภาพแตก เสียขาดหาย บางทีใช้ๆไปก็หลุดต้องต่อกันใหม่ เถียงกันไปเถียงกันมากระหว่างคนขายกับคนให้บริการอินเตอร์เน็ต สุดท้ายลูกค้าต้องยอมใช้งานในสภาพแบบนั้น ของซื้อมาแล้ว เงินก็จ่ายแล้วอีกต่างหาก คือจะยี่ห้อดังขนาดไหน ของราคาแพงขนาดไหน ต้องดูแบนวิดธ์ที่จะใช้งานด้วยครับ ไม่ใช่ดูกันแค่ขา Download 10M, 50M หรือ 100M เท่านั้น ต้องดูขา Upload ด้วยครับ ถ้ามีไม่ถึง 1M ก็ไม่ต้องคาดหวังว่าจะได้คุณภาพดีเลยครับ ถ้าแบนวิดธ์มีพอภาพจากอุปกรณ์ราคาหลักพันก็อาจจะเทียบเท่าได้กับภาพจากอุปกรณ์หลักล้านครับ **
เทคนิคการทำให้ Asterisk รองรับ Video Codec แบบ VP8 นี้นะครับ ผมทดสอบด้วย Asterisk 11.6.0 ซึ่งเป็นเวอร์ชั่น Stable ใหม่ล่าสุด ณ ขณะนี้ครับ เวอร์คดีครับ ท่านที่ต้องการจะทดลองทำผมแนะนำอย่างนี้นะครับเพื่อไม่ให้งง
1. ติดตั้ง Asterisk 11.6.0 จนเสร็จและรันได้
ตามบทความนี้เลยครับ เทคนิคการติดตั้ง Asterisk 11.6.0 บน CentOS 6.4
2. แล้วค่อยกลับมา Patch Asterisk แล้วคอมไพล์ใหม่
บทความนี้จะแนะนำวิธี Patch Asterisk เพื่อให้รองรับ Video Codec แบบ VP8 ครับ
** การ Patch ตามบทความนี้จะทำให้ Asterisk รองรับ VP8 แบบ Passthrough นะครับ ซึ่งหมายความว่าต้นทางและปลายทางจะต้องรองรับ VP8 ทั้งคู่เลย จะแบบฝั่งหนึ่งเป็น H.264 แต่อีกฝั่งเป็น VP8 อย่างนี้ไม่ได้นะครับ ห้ามเลย **
เอาหล่ะครับ เริ่มเลย
1. ดาวน์โหลด Patch ที่จะทำให้ Asterisk รองรับ VP8
- โค้ด: เลือกทั้งหมด
cd /home
wget https://raw.github.com/AutoStatic/asterisk-vp8/master/asterisk_11_vp8_passthrough_support.patch
2. ดาวน์โหลด Source Code Asterisk 11.6.0
- โค้ด: เลือกทั้งหมด
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11.6.0.tar.gz
tar xzvf asterisk-11.6.0.tar.gz -C /usr/src
cd /usr/src/asterisk-11.6.0
3. แก้ไขไฟล์ Patch ให้เหมาะกับ Asterisk 11.6.0
ไฟล์ .tar.gz ของ Asterisk ที่เราแตกในขั้นตอนที่ 2 นั้นนะครับ ไฟล์จะเก็บไว้ในไดเร็คตอรี่ /usr/src/asterisk-11.6.0 เราต้องแก้ไขไฟล์ Patch ให้ตรงด้วยครับ
- โค้ด: เลือกทั้งหมด
vi /home/asterisk_11_vp8_passthrough_support.patch
ค้นหาข้อความ asterisk-11.1.2 แล้วแทนที่ด้วย asterisk-11.6.0
** หรือถ้าขึ้เกียจแก้หลายบรรทัด ก็โหลดไฟล์นี้เลยครับ ผมแก้ไขให้แล้ว (แต่จะใช้ได้กับ Asterisk 11.6.0 เท่านั้นครับ) **
- โค้ด: เลือกทั้งหมด
cd /home
rm -rf asterisk_11_vp8_passthrough_support.patch
wget http://www.voip4share.com/sources/asterisk_11_vp8_passthrough_support.patch
4. ทำการ Patch Asterisk
- โค้ด: เลือกทั้งหมด
cd /usr/src/asterisk-11.6.0
patch -p1 -i /home/asterisk_11_vp8_passthrough_support.patch
ถ้าไม่มี Error อะไรก็จะได้ข้อความประมาณนี้ครับ
- โค้ด: เลือกทั้งหมด
patching file channels/chan_sip.c
Hunk #1 succeeded at 11121 (offset 80 lines).
Hunk #2 succeeded at 31158 (offset 334 lines).
patching file channels/console_video.c
patching file include/asterisk/format.h
patching file main/format.c
Hunk #3 succeeded at 1061 (offset -1 lines).
patching file main/rtp_engine.c
Hunk #1 succeeded at 2283 (offset 21 lines).
Hunk #2 succeeded at 2316 (offset 21 lines).
5. คอมไพล์ Asterisk ใหม่อีกครั้ง
- โค้ด: เลือกทั้งหมด
make distclean
cd /usr/src/asterisk-11.6.0
./configure --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --localstatedir=/var --disable-asteriskssl
make menuselect
make -j `getconf _NPROCESSORS_ONLN`
make install
make config
ไม่ต้อง make samples หรอกนะครับไม่งั้นคอนฟิกใน /etc/asterisk อาจจะหายเกลี้ยงได้
6. เพิ่มบรรทัดนี้ในไฟล์ /etc/asterisk/sip.conf
- โค้ด: เลือกทั้งหมด
videosupport=yes
allow=vp8
และคอนฟิก SIP ของเบอร์ Extension ที่จะใช้ Video VP8 ก็ให้เพิ่มบรรทัดนี้เข้าไปด้วยครับ
- โค้ด: เลือกทั้งหมด
allow=vp8
ตัวอย่างครับ
- โค้ด: เลือกทั้งหมด
[104]
host=dynamic
port=5060
disallow=all
allow=ulaw
allow=h264
allow=vp8
...
วิธีที่ผมใช้ในการทดสอบ
เบอร์ 103 เป็น Linphone บน Windows และ 104 เป็น Linphone บน Android ทั้งสองเบอร์นี้อยู่ใน LAN เดียวกัน ออกเน็ตด้วย ADSL ของ True แพ็กเกจปกติ 10M/512K ส่วน Asterisk อยู่ที่ Colo ครับ ซึ่งมี Bandwidth Upload/Download มหาศาล
ขณะทดสอบ
รันคำสั่งต่อไปนี้ใน Asterisk Console
1. คำสั่ง sip show peer 104 และ sip show peer 103
เบอร์ 104 ผมใช้ Linphone บน Androd 4.2.2
- โค้ด: เลือกทั้งหมด
* Name : 104
Description :
Secret : <Set>
MD5Secret : <Not set>
Remote Secret: <Not set>
Context : gsm-callback
Record On feature : automon
Record Off feature : automon
Subscr.Cont. : from-internal-subscribe
Language :
Tonezone : <Not set>
AMA flags : Unknown
Transfer mode: open
CallingPres : Presentation Allowed, Not Screened
Callgroup : 1
Pickupgroup : 1
Named Callgr :
Nam. Pickupgr:
MOH Suggest :
Mailbox : 103@device
VM Extension : asterisk
LastMsgsSent : 0/0
Call limit : 2147483647
Max forwards : 0
Dynamic : Yes
Callerid : "device" <0870050676>
MaxCallBR : 384 kbps
Expire : 93
Insecure : no
Force rport : Yes
Symmetric RTP: Yes
ACL : Yes
DirectMedACL : No
T.38 support : Yes
T.38 EC mode : FEC
T.38 MaxDtgrm: -1
DirectMedia : No
PromiscRedir : No
User=Phone : Yes
Video Support: Yes
Text Support : No
Ign SDP ver : No
Trust RPID : No
Send RPID : No
Subscriptions: Yes
Overlap dial : Yes
DTMFmode : rfc2833
Timer T1 : 500
Timer B : 32000
ToHost :
Addr->IP : 192.168.102.6:5060
Defaddr->IP : (null)
Prim.Transp. : UDP
Allowed.Trsp : UDP
Def. Username: 104
SIP Options : (none)
Codecs : (ulaw|vp8)
Codec Order : (ulaw:20,vp8:0)
Auto-Framing : No
Status : OK (558 ms)
Useragent : LinphoneAndroid/2.2.1.1 (belle-sip/1.2.4)
Reg. Contact : sip:104@192.168.102.6
Qualify Freq : 60000 ms
Keepalive : 0 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot :
Use Reason : No
Encryption : No
เบอร์ 103 ผมใช้ Linphone บน Windows 8
- โค้ด: เลือกทั้งหมด
* Name : 103
Description :
Secret : <Set>
MD5Secret : <Not set>
Remote Secret: <Not set>
Context : gsm-callback
Record On feature : automon
Record Off feature : automon
Subscr.Cont. : from-internal-subscribe
Language :
Tonezone : <Not set>
AMA flags : Unknown
Transfer mode: open
CallingPres : Presentation Allowed, Not Screened
Callgroup : 1
Pickupgroup : 1
Named Callgr :
Nam. Pickupgr:
MOH Suggest :
Mailbox : 103@device
VM Extension : asterisk
LastMsgsSent : 0/0
Call limit : 2147483647
Max forwards : 0
Dynamic : Yes
Callerid : "device" <0851619439>
MaxCallBR : 384 kbps
Expire : 53
Insecure : no
Force rport : Yes
Symmetric RTP: Yes
ACL : Yes
DirectMedACL : No
T.38 support : Yes
T.38 EC mode : FEC
T.38 MaxDtgrm: -1
DirectMedia : No
PromiscRedir : No
User=Phone : Yes
Video Support: Yes
Text Support : No
Ign SDP ver : No
Trust RPID : No
Send RPID : No
Subscriptions: Yes
Overlap dial : Yes
DTMFmode : rfc2833
Timer T1 : 500
Timer B : 32000
ToHost :
Addr->IP : 192.168.101.51:5252
Defaddr->IP : (null)
Prim.Transp. : UDP
Allowed.Trsp : UDP
Def. Username: 103
SIP Options : (none)
Codecs : (ulaw|vp8)
Codec Order : (ulaw:20,vp8:0)
Auto-Framing : No
Status : OK (747 ms)
Useragent : Linphone/3.6.1 (eXosip2/3.6.0)
Reg. Contact : sip:103@192.168.101.51:5252;line=ae3785abc3431e7
Qualify Freq : 60000 ms
Keepalive : 0 ms
Sess-Timers : Accept
Sess-Refresh : uas
Sess-Expires : 1800 secs
Min-Sess : 90 secs
RTP Engine : asterisk
Parkinglot :
Use Reason : No
Encryption : No
2. ขณะทำ Video Call รันคำสั่ง sip show channels
- โค้ด: เลือกทั้งหมด
124.120.251.118 104 2511b1c47ce987a (ulaw|vp8) No Rx: INFO 104
192.168.101.51 103 30069 (ulaw|vp8) No Tx: INFO 103
ผลที่ได้รับ
คุณภาพของภาพ ได้ประมาณนี้ครับ (ภาพแตกเป็นที่แบนวิดธ์ไม่พอ ภาพไม่ค่อยชัดเป็นที่ความละเอียดกล้อง)
ลองใช้งานดูครับ