JMF RTP Transmit
หลังจากวุ่น ๆ กับวิธีการทำ Register กับเจ้า Asterisk อยู่นานจนสามารถ Register ได้ แต่ก็มาถึงขั้นตอนการ Invite และ เริ่มคุยกับ ขั้นตอนการ Invite ก็คล้าย ๆ กับ Register นะแหละ แต่ผมยังไม่ได้เขียน เพราะว่า เมื่อ Invite เสร็จแล้ว ก็ต้องมีการส่งข้อมูลกัน ซึ่งตรงนี้ต้องใช้ความรู้ของเรื่อง JMF และ RTP ผมก็เลย แว๊บ มาเขียนเรื่องนี้ไว้สักหน่อยกันลืมคร๊าบ...บ :-)
|
import javax.media.*; import javax.media.control.*; public class Transmit { public Transmit( String destAddress, int destPort) { MediaLocator ml = new MediaLocator("javasound://"); try { try { processor.setContentDescriptor(new TrackControl [] tracks = processor.getTrackControls(); processor.realize(); DataSource output = processor.getDataOutput(); public static void main(String[] args) { |
code ตัวอย่างนี้ เป็นการเขียน JMF สำหรับส่งเสียงผ่านทาง RTP โดยมีหลักการทำงานคือ
- สร้าง media Locator ซึ่งอาจจะเป็น javasound:// (microphone), file:// , vfw:// หรืออื่น ๆ
- สร้าง Datasource (source) จาก medialocator
- สร้าง processor เพื่อนำ datasource ที่กำหนดมาประมวลผลก่อน เราสามารถกำหนด Codec, sampling rate และตัวแปรอื่น ๆ ใน processor จากนั้นก็สั่ง processor ให้ realize() และรอจนกว่ามันจะ realized เสร็จเรียบร้อย เพื่อเตรียมพร้อมส่งข้อมูล
- สร้าง DataSource (output) จาก processor อีกครั้ง เพื่อพร้อมที่จะส่งข้อมูล
- สร้าง RTPManager เพื่อ initialize และ addTarget ระหว่างผู้รับกับผู้ส่ง
- สร้าง SessionAddress ของ ผู้รับและผู้ส่ง และเชื่อมต่อ SessionAddress ผ่าน RTPManager
- สร้าง SendStream จาก DataSource (output) ผ่าน RTPManager แล้วก็ส่ง Stream ลงไปใน network และ start processor
ก่อนทดลอง run code นี้ อย่าลืมติดตั้ง JMF lib ก่อน ผมทดลอง code นี้ บน Ubuntu สามารถ run ได้ แต่ปรากฎว่าไม่มันไม่ยอมส่ง packet ออกไป คาดว่าน่าจะเป็นการติดตั้ง JMF ที่ไม่สมบูรณ์ แต่ ทดลองบน Windows XP ไม่พบปัญหาใด ๆ ครับ
วันนี้ได้ทดสอบเพิ่มเติมนิดหน่อย
หากต้องการเปลี่ยนจาก mic => MediaLocator ml = new MediaLocator("javasound://");
เป็น wav เราสามารถใช้ => MediaLocator ml = new MediaLocator("file:///C:/WINDOWS/Media/chord.wav"); ได้
แต่ถ้าเปลี่ยนเป็น mp3 => MediaLocator ml = new MediaLocator("file:///E:/java/nb/TestJMF/song.mp3");
เราจะพบว่า JMF ไม่สามารถ Realize mp3 format โดย default ได้
วิธีการแก้ไข คือต้องไป load mp3 plugin จาก http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.html เพื่อให้ JMF สามารถ decode MP3 ได้
หากอยากทราบว่า mp3 นั้น สามารถ แปลงเป็นอะไรได้บ้าง ก็ตรวจสอบได้จาก http://java.sun.com/javase/technologies/desktop/media/jmf/2.1.1/formats.html ครับ
คือตอนนี้ผมกำลังทำโปรเจคเกี่ยวกับ การใช้วีดีโอ โดยใช้ผ่าน jmf คืออยากทราบว่าถ้าต้องการจะเซฟวีดีโอจาก client โดยผ่าน
object player ต้องทำอย่างไรบ้าง
ขอบคุณล่วงหน้าครับ
อยากสอบถามเพิ่มเติม ว่า JMF สามารถใช้งานกับกล้องทุกชนิดหรือเปล่าครับ รวมถึงพวกกล้องเว็บแคมที่มีขายตามตลาดด้วยน่ะครับ
ขอบคุณสำหรับบทความนะคะ
หลังจากที่ได้ลองนำโค้ดนี้มารันโดยใช้ NetBeans IDE 6.9 และเปลี่ยนโค้ด new Transmit("147.127.240.91",9000);
เป็ IP ของเครื่อง ผลที่ได้คือ
ฝั่ง Transmit : Realize completed.
finish
ฝั่ง Recieve : test
Wait for incoming data
แต่ว่าไม่มีอะไรเกิดขึ้นเลย เลยอยากทราบว่าโค้ดนี้สามารถรันได้ปกติหรือว่าต้องใช้ผ่าน JMStudio คะ
ปล.ใช้ window7 ค่ะ ต้องขอรบกวนด้วยนะคะ ขอบคุณค่ะ
ขอโทดด้วยนะคะ เมื่อกี๊ลืมใส่ชื่อ และ e-mail ค่ะ
ขออภัยครับ ไม่ได้เข้ามานาน ช่วงนี้ผมห่างหายไปกับ SIP Programming พอสมควร
> เซฟวีดีโอจาก client โดยผ่าน object player ต้องทำอย่างไรบ้าง
ไว้ถ้าผมมีเวลาจะลองทำดูนะครับ
> JMF สามารถใช้งานกับกล้องทุกชนิดหรือเปล่าครับ
ไม่ทุกชนิดครับ ถ้าเสียบแล้ว JMF Studio หาเจอ ก็ใช้ได้ครับ
>แต่ว่าไม่มีอะไรเกิดขึ้นเลย
ลอง check หมายเลข port ของ Transmit กับ Receive นะครับ
คือใน ตัวอย่าง ที่ผมระบุ port ของ Transmit กับ Receive เป็นคนละ port กัน
เพราะว่า เป็นตัวอย่าง ที่ใช้สำหรับ ส่งและรับ ในตัวเดียวกัน (คือ receive port เป็นหมายเลข port ในการรับข้อมูล ของผู้ส่ง จึงไม่สามารถใช้หมายเลขเดียวกันกับ port ของผู้ส่งได้)
ถ้าต้องการทดสอบ แบบ ผู้ส่ง ส่งอย่างเดียว ผู้รับ รับอย่างเดียว ให้กำหนดดังนี้ครับ
ผู้ส่ง PC1 : Transmit("147.127.240.91",8000);
ผู้รับ PC2 : new Receive(8000);
> เลยอยากทราบว่าโค้ดนี้สามารถรันได้ปกติหรือว่าต้องใช้ผ่าน JMStudio คะ
รันได้ปรกติไม่ต้องผ่าน JMStudio ครับ
ได้ทดลองเปลี่ยน port ตามที่แนะนำแล้วค่ะ
ผลที่ได้คือ
ฝั่ง Transmit : Realize completed.
finish
ฝั่ง Recieve : Cannot initialize RTP Manager
Wait for incoming data
แล้วก็ยังไม่มีอะไรเกิดขึ้นเลยค่ะ
ไม่ทราบว่า OS มีผลมั๊ยคะ หรือจำเป็นต้องใช้ Window XP คะ
สวัสดีครับ (ไม่รู้ว่ายังทำ JMF อยู่อีกหรือเปล่านะ?) วันนี้ ผมมีโอกาสได้ทดลอง Run โปรแกรมนี้ บน Windows7 สามารถทำงานได้ครับ ไม่มีปัญหาแต่อย่างใด ไม่ว่าจะทำงานบน Windows7 ในส่วนของ Transmit หรือ ทำงานเป็น Receive สามารถใช้งานได้หมดครับ
ผมเคยเจอ Error: Cannot initialize RTP Manager ในกรณีที่ port มันเปิดค้างอยู่ ซึ่งเกิดจากการ Run โปรแกรมค้างไว้
โดยไม่ได้ End process ให้หมดครับ ลอง clear java process ให้หมด แล้วทดลองใหม่ น่าจะแก้ปัญหาได้
ขอเขียน Note เพิ่มเติมไว้นิดหน่อย กันลืม หลังจากห่างหายไปนาน (เนื่องจากไปวุ่น ๆ อยู่กับ Jxta P2P )
1) Link สำหรับ Load plugin jmf-mp3 ได้เปลี่ยนจาก
=> http://java.sun.com/javase/technologies/desktop/media/jmf/mp3/download.htm
มาเป็น
=> http://www.oracle.com/technetwork/java/javase/download-137625.html
2) โปรแกรม Transmit.java ในกรณีที่ set medialocator เป็น audio file จะต้อง Add class path ให้ชี้มา jmf.jar ด้วย
ไม่เช่นนั้นจะเจอ Error
Failed to build a graph for the given custom options.
Failed to realize: com.sun.media.ProcessEngine@f5da06
Cannot build a flow graph with the customized options:
Unable to transcode format: mpeglayer3, 44100.0 Hz, 16-bit, Stereo, LittleEndian, Signed, 20000.0 frame rate, FrameSize=8 bits
to: ULAW/rtp, Unknown Sample Rate
outputting to: RAW/RTP
Error: Unable to realize com.sun.media.ProcessEngine@f5da06
รบกวนสอบถามหน่อยครับ
หากต้องการส่งไฟล์ วีดีโอ (ภาพและเสียงพร้อมกัน)
จากโค้ดตัวอย่างที่ให้มาจะต้องแก้ตรงไหนบ้างครับ
และควรศึกษาการส่งข้อมูลรูปแบบอื่นๆ ได้จากที่ใดบ้าง
รบกวนด้วยนะครับ