Article:
Mẹo vặt Red5
2228
ngocdaothanh.myopenid.com 172Updated over 2 years ago |
Sau khi tìm hiểu RTMP và cài Red5, với kiến thức Java cơ bản sẵn có chắc bạn đã sẵn sàng dùng Red5 để viết trang web chia sẻ phim, multiplayer game, hay bét ra cũng là chương trình webcam chống trộm phải không?
Bài này trình bày một số mẹo vặt khi dùng Red5, có lẽ sẽ không còn cần thiết khi Red5 1.0 ra đời.
Trước khi đọc tiếp, cần đọc các tài liệu trong thư mục doc của Red5.
Kiểu cài đặt
Có 2 kiểu cài:
- Standalone: Có sẵn Jetty hoặc Tomcat làm server, tùy phiên bản Red5
- WAR: Cài như là chương trình web Java bình thường
Để đơn giản nên cài kiểu standalone.
Debug bằng Eclipse
Nếu là standalone:
- Sửa conf/wrapper.conf (chỗ conf/red5.policy có thể phải dùng đường dẫn tuyệt đối, chỗ 8787 không thể đổi thành cổng khác)
wrapper.java.additional.1=-Djava.security.manager
wrapper.java.additional.2=-Djava.security.policy=conf/red5.policy
wrapper.java.additional.3=-Xdebug
wrapper.java.additional.4=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y - Làm tiếp theo hướng dẫn ở http://sziebert.net/posts/remote-debugging-red5-applications/
Nếu là WAR: dùng plugin Tomcat nào đó.
rejectClient
Trong xxxConnect:
- Không cho client connect: return false
- Để trả về giá trị gì đó cho client: rejectClient(value)
Điều quan trọng là 2 cái trên độc lập với nhau! Nghĩa là rejectClient nhưng trả về true, thì ở client, event.info.code vẫn có giá trị là "NetConnection.Connect.Success". Để check giá trị trả về ở client, dùng event.info.application.
Tuy nhiên, để tránh phải xử lí phức tạp ở onNetStatus, không nên truyền kết quả kiểu này, mà server gọi luôn hàm gì đó ở client cho xong:
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("onLoginSuccess", new Object[] {nicks, moves});
Duyệt qua các client
Iterator it = this.getScope().getClients().iterator();
while (it.hasNext()) {
IClient client = (IClient) it.next();
}
Attribute
Lợi hại, ví dụ có thể dùng để đánh dấu player đã login hay chưa.
Tuy nhiên để attribute không persistent (lưu vào thư mục persistent của app):
- xxx.setPersistent(false) không tác dụng, có lẽ tuỳ phiên bản
- Phải gọi xxx.setStore(null) trước khi gọi get/setAttribute
Truyền array
Java và ActionScript là 2 ngôn ngữ khác nhau, nên không thể truyền dữ liệu có kiểu bất kì cho nhau. Đối với kiểu array (hay dùng):
- Actionscript index array of the same data type converts to a Java array.
- Actionscript index array of different data types converts to a Java ArrayList.
- Actionscript associative array converts to a Java HashMap.
Cắt ảnh từ video truyền từ client
Thường người ta dùng Red5 để stream video từ server cho client. Đối với chương trình như hội thảo video trực tuyến, có thể truyền video (webcam) từ client cho server để server broadcast lại cho các client khác. Lúc này nếu muốn cắt frame nào đó từ video thành ảnh tĩnh, có thể tham khảo đoạn mã này.
Đoạn mã này lưu phim theo định dạng FLV xuống đĩa, rồi gọi chương trình ffmpeg bên ngoài theo kiểu command line để chuyển tập tin video FLV lưu trên đĩa thành ảnh PNG. Cách này chậm, tốn nhiều CPU. Cách tốt hơn là xử lí in-process, chẳng hạn nối trực tiếp với libffmpeg hoặc dùng thư viện gì đó của Java để chuyển khối dữ liệu theo định dạng FLV thẳng thành khối dữ liệu theo định dạng PNG.
Tham khảo
- http://osflash.org/red5/help
- http://labs.adobe.com/technologies/flex/
- http://dev.binertia.com/red5.html
- http://www.actionscript.org/resources/articles/615/1/Getting-started-with-red5-server/Page1.html
- http://www.red5tutorials.net
- http://www.joachim-bauch.de/tutorials/red5/MigrationGuide.txt/view
- http://jira.red5.org/confluence/display/codecs/Data+Type+Mappings
172