เทคนิคทำให้ Asterisk รองรับ Video Codec แบบ VP8

Asterisk Opensource IP Pbx

เทคนิคทำให้ Asterisk รองรับ Video Codec แบบ VP8

โพสต์โดย nuiz » 15 พ.ย. 2013 01:21

** บทความนี้ใช้ได้กับ Asterisk 1.8.x และ 11.x ทำกับ Asterisk เดิมในเครื่องได้เลยครับไม่ต้องลงใหม่**

เกี่ยวกับ 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       


ผลที่ได้รับ
คุณภาพของภาพ ได้ประมาณนี้ครับ (ภาพแตกเป็นที่แบนวิดธ์ไม่พอ ภาพไม่ค่อยชัดเป็นที่ความละเอียดกล้อง)




ลองใช้งานดูครับ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7058
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33

Re: เทคนิคทำให้ Asterisk รองรับ Video Codec แบบ VP8

โพสต์โดย uptooyou » 08 ม.ค. 2014 19:40

ติดตั้ง VP8 error
ผมใช้ asterisk 1.8.24.0 ไม่ทราบว่าสามารถใช้ได้หรือป่าว
ผมตามขั้นตอน
1. Download wget https://raw.github.com/AutoStatic/aster ... port.patch
2. แก้ไขไฟล์ Patch ให้เหมาะกับ Asterisk โดย
vi /usr/src/asterisk_11_vp8_passthrough_support.patch
เปลี่ยน asterisk-11.1.2 แล้วแทนที่ด้วย asterisk-1.8.24.0 ทุกค่า
3. ทำการ Patch Asterisk
patch -p1 -i /usr/src/asterisk_11_vp8_passthrough_support.patch
4. มี error

patching file channels/chan_sip.c
Hunk #1 succeeded at 10141 (offset -900 lines).
Hunk #2 FAILED at 30824.
1 out of 2 hunks FAILED -- saving rejects to file channels/chan_sip.c.rej
patching file channels/console_video.c
can't find file to patch at input line 36
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff -ru -x 'config.*' -x 'menuselect*' asterisk-1.8.24.0/include/asterisk/format.h asterisk-1.8.24.0+vp8/include/asterisk/format.h
|--- asterisk-1.8.24.0/include/asterisk/format.h 2012-07-13 20:41:07.000000000 +0200
|+++ asterisk-1.8.24.0+vp8/include/asterisk/format.h 2013-01-15 09:08:58.027274530 +0100
--------------------------
File to patch:
uptooyou
Bronz Member
 
โพสต์: 13
ลงทะเบียนเมื่อ: 17 มิ.ย. 2012 10:35

Re: เทคนิคทำให้ Asterisk รองรับ Video Codec แบบ VP8

โพสต์โดย nuiz » 12 ม.ค. 2014 20:37

จำได้คร่าวๆว่า น่าจะเกี่ยวข้องกับเวอร์ชั่นของ Asterisk ด้วยหน่ะครับ รองรับ Asterisk 11.x ขึ้นไป

ถ้าจำผิดก็ต้องขออภัยด้วยครับ
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7058
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33


ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 22 ท่าน

cron