`
pxchen
  • 浏览: 85165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Red5 录制视频

    博客分类:
  • java
阅读更多
import java.io.File;

import org.apache.mina.common.ByteBuffer;
import org.red5.io.IStreamableFile;
import org.red5.io.ITag;
import org.red5.io.ITagWriter;
import org.red5.io.flv.impl.FLVService;
import org.red5.io.flv.impl.Tag;
import org.red5.io.utils.ObjectMap;
import org.red5.server.api.event.IEvent;
import org.red5.server.api.event.IEventDispatcher;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.net.rtmp.Channel;
import org.red5.server.net.rtmp.RTMPClient;
import org.red5.server.net.rtmp.RTMPConnection;
import org.red5.server.net.rtmp.codec.RTMP;
import org.red5.server.net.rtmp.event.AudioData;
import org.red5.server.net.rtmp.event.IRTMPEvent;
import org.red5.server.net.rtmp.event.Notify;
import org.red5.server.net.rtmp.event.VideoData;
import org.red5.server.net.rtmp.message.Header;
import org.red5.server.net.rtmp.status.StatusCodes;
import org.red5.server.stream.AbstractClientStream;
import org.red5.server.stream.IStreamData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyRtmpClient extends RTMPClient {

private static final Logger logger = LoggerFactory.getLogger(MyRtmpClient.class);

private String saveAsFileName = "test.flv";

public static void main(String[] args) {

String host = "localhost";
String app = "oflaDemo";
final String name = "IronMan.flv";
int port = 1935;
final int duration = 10000; // milliseconds, -2 means until end of stream

final MyRtmpClient client = new MyRtmpClient();
logger.debug("connecting, host: " + host + ", app: " + app + ", port: " + port);

IPendingServiceCallback callback = new IPendingServiceCallback() {
public void resultReceived(IPendingServiceCall call) {
logger.debug("service call result: " + call);
if ("connect".equals(call.getServiceMethodName())) {
client.createStream(this);
} else if ("createStream".equals(call.getServiceMethodName())) {
Integer streamId = (Integer) call.getResult();
logger.debug("createStream result stream id: " + streamId);
logger.debug("playing video by name: " + name);
client.play(streamId, name, 0, duration);
}
}
};

client.connect(host, port, app, callback);

}

private RTMPConnection conn;
private ITagWriter writer;

private int videoTs;
private int audioTs;

@Override
public void connectionOpened(RTMPConnection conn, RTMP state) {
logger.debug("connection opened");
super.connectionOpened(conn, state);
this.conn = conn;
init();
}

@Override
public void connectionClosed(RTMPConnection conn, RTMP state) {
logger.debug("connection closed");
super.connectionClosed(conn, state);
if (writer != null) {
writer.close();
writer = null;
}
System.exit(0);
}

@Override
public void createStream(IPendingServiceCallback callback) {
logger.debug("create stream");
IPendingServiceCallback wrapper = new CreateStreamCallBack(callback);
invoke("createStream", null, wrapper);
}

@Override
protected void onInvoke(RTMPConnection conn, Channel channel, Header header, Notify notify, RTMP rtmp) {
super.onInvoke(conn, channel, header, notify, rtmp);
ObjectMap<String, String> map = (ObjectMap) notify.getCall().getArguments()[0];
String code = map.get("code");
if (StatusCodes.NS_PLAY_STOP.equals(code)) {
logger.debug("onInvoke, code == NetStream.Play.Stop, disconnecting");
disconnect();
}
}

private void init() {
File file = new File(saveAsFileName);
FLVService flvService = new FLVService();
flvService.setGenerateMetadata(true);
try {
IStreamableFile flv = flvService.getStreamableFile(file);
writer = flv.getWriter();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

private class CreateStreamCallBack implements IPendingServiceCallback {

private IPendingServiceCallback wrapped;

public CreateStreamCallBack(IPendingServiceCallback wrapped) {
this.wrapped = wrapped;
}

public void resultReceived(IPendingServiceCall call) {
Integer streamIdInt = (Integer) call.getResult();
if (conn != null && streamIdInt != null) {
MyNetStream stream = new MyNetStream();
stream.setConnection(conn);
stream.setStreamId(streamIdInt.intValue());
conn.addClientStream(stream);
}
wrapped.resultReceived(call);
}

}

private class MyNetStream extends AbstractClientStream implements IEventDispatcher {

public void close() { }

public void start() { }

public void stop() { }

public void dispatchEvent(IEvent event) {
if (!(event instanceof IRTMPEvent)) {
logger.debug("skipping non rtmp event: " + event);
return;
}
IRTMPEvent rtmpEvent = (IRTMPEvent) event;
if (logger.isDebugEnabled()) {
logger.debug("rtmp event: " + rtmpEvent.getHeader() + ", "
+ rtmpEvent.getClass().getSimpleName());
}
if (!(rtmpEvent instanceof IStreamData)) {
logger.debug("skipping non stream data");
return;
}
if (rtmpEvent.getHeader().getSize() == 0) {
logger.debug("skipping event where size == 0");
return;
}
ITag tag = new Tag();
tag.setDataType(rtmpEvent.getDataType());
if (rtmpEvent instanceof VideoData) {
videoTs += rtmpEvent.getTimestamp();
tag.setTimestamp(videoTs);
} else if (rtmpEvent instanceof AudioData) {
audioTs += rtmpEvent.getTimestamp();
tag.setTimestamp(audioTs);
}
ByteBuffer data = ((IStreamData) rtmpEvent).getData().asReadOnlyBuffer();
tag.setBodySize(data.limit());
tag.setBody(data);
try {
writer.writeTag(tag);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

}

使用:
commons-collections-3.2.jar
jcl104-over-slf4j-1.4.3.jar
logback-classic-0.9.8.jar
logback-core-0.9.8.jar
mina-core-1.1.6.jar
red5.jar
slf4j-api-1.4.3.jar
spring-beans-2.0.8.jar
spring-context-2.0.8.jar
spring-core-2.0.8.jar
分享到:
评论
1 楼 zouwu85 2011-03-29  
你好,你这个能录制网络上的flv小游戏的数据吗?

相关推荐

    更改red5录制视频文件的存放路径

    /** Path that will store recorded videos. */ public String recordPath = "recordedStreams/"; /** Path that contains VOD streams.... public String playbackPath = "videoStreams/"; /** Set if the path ...

    red5视频插件

    这个"red5视频插件"很可能是一个与Red5服务器配合使用的播放器组件,用于优化视频流的播放体验。 在流媒体开发中,Red5扮演着至关重要的角色。它允许开发者创建各种类型的多媒体应用程序,如直播、录制、播放、存储...

    利用red5实现视频在线播放

    Red5是由Java开发的流媒体服务器,它允许开发者创建、录制、存储和分发音频、视频、数据以及屏幕共享流。Red5支持多种流媒体协议,包括RTMP、HLS(HTTP Live Streaming)和RTSP(Real-Time Streaming Protocol),...

    red5-rtsp视频服务器

    使用Red5 RTSP视频服务器,你可以实现以下功能: 1. **视频直播**:通过Red5 Server,你可以将视频源(如摄像头)的实时数据推送到服务器,并分发给多个客户端,实现大规模的视频直播。 2. **录制与回放**:Red5 ...

    red5chatv2.1 red5建的一个FLASH视频聊天会议例子

    RED5是一款用Java编写,支持实时流传输协议(RTMP)的服务器,它允许用户创建、录制以及播放音频、视频和其他交互式富媒体内容。 【描述】中提到的"red5chatv2.1 red5建的一个FLASH视频聊天会议例子"表明这是一个...

    使用red5插件搭建Java开发环境

    Red5是一个开源的流媒体服务器,它支持实时的音频、视频流传输,以及录制、播放等功能。本篇文章将详细阐述如何使用Red5插件搭建Java开发环境,帮助你创建并运行你的第一个Red5项目。 首先,了解Red5的基础概念是...

    列表显示red5服务器视频并点击播放

    Red5是一个基于Java的流媒体服务器,它支持RTMP(Real Time Messaging Protocol)、HLS(HTTP Live Streaming)和RTSP(Real Time Streaming Protocol)等协议,可以提供实时流服务,例如在线视频播放、直播和录制。...

    red5流媒体视频会议入门实例

    接下来,你还需要编写客户端代码,使用ActionScript或者Flex来与服务器通信,实现视频播放、录制、互动等功能。客户端通常会通过RTMP协议与Red5服务器建立连接,获取或发送视频流。 在客户端开发中,你需要创建一个...

    Red5手册详细教程

    在Red5的手册中,还介绍了Red5使用的默认端口,包括http.port=5080、rtmp.port=1935、rtmpt.port=8088、mrtmp.port=9035、proxy.source_port=1936等,可以在[RED5_HOME]\conf\red5.properties文件中更改。...

    基于Red5的录音录像方法和代码

    Red5是一款开源的媒体服务器,主要用于实时音视频流传输、录制、转码等操作。它支持多种协议,如RTMP、WebRTC等,并且可以方便地集成到Flash和其他客户端应用中。本文将详细介绍如何使用Red5进行录音录像的方法及其...

    利用red5和ffmpeg搭建rtmp流媒体服务器

    - 转换RTSP流为RTMP流:使用FFmpeg命令行工具将摄像机采集的RTSP协议视频流转换为RTMP格式,并推送到Red5服务器。具体命令格式为:ffmpeg -i "RTSP流地址" -f flv -r 25 -s 640x480 -an "RTMP流地址"。其中-i后面跟...

    Red5+的安装和使用

    Red5是一款基于Java的开源Flash流媒体服务器,它支持RSTP协议,提供了一系列示例应用,如在线录制、播放、聊天和视频会议等。Red5作为Macromedia商业产品FMS的一个替代方案,具有开源、成本低和可扩展性强的优势。在...

    Flex+Red5+Tomcat视频语音录制、播放

    Flex Red5 Tomcat 视频语音录制和播放 在网上找,总发现文章都一样,而且都是不完整的, 这里希望能够给跟我一样学习中的朋友一些帮助, 详细说明在压缩文件中有。 Flex+Red5+Tomcat视频播放器: ...

    Android_Red5.zip_java 直播_red5 视频点播_red5视频点播_直播android_视频流

    总结一下,实现Android实时录制视频流并上传到Red5服务器,涉及以下几个关键步骤: 1. 配置和使用Android MediaRecorder进行视频录制。 2. 使用Java的Socket类建立与Red5服务器的连接。 3. 实现RTMP推送,将视频流推...

    基于 Red5 的流媒体服务器的搭建和应用

    访问Red5官方网站下载最新版本的Red5,解压后即可使用。对于生产环境,建议通过脚本或服务管理工具将其设置为系统服务。 ##### 3.3 配置Red5 Red5的配置文件通常位于`conf`目录下,主要包括`server.xml`、`context...

    AS3与RED5 播放视频

    总结起来,AS3与RED5的结合使用涵盖了视频播放、视频录制等多个方面,它们为开发者提供了一个强大的工具集,可以在Web上实现丰富的多媒体交互体验。通过深入学习和实践,你可以创建出具有高度定制化和交互性的视频...

    red5入门,tomcat+red5+myeclipse集成,原创禁止转载

    Red5是一款开源的流媒体服务器,它支持实时流传输协议(RTMP),并提供录制、播放、存储等功能,广泛应用于在线视频直播、VoIP、互动游戏等场景。本教程将介绍如何进行Red5的入门学习,并结合Tomcat和MyEclipse进行...

    Red5安装与使用入门

    Red5是一款基于Java开发的开源流媒体服务器,它支持多种功能,包括将音频(MP3)和视频(FLV)转换为播放流,客户端播放流的录制(仅限FLV),共享对象,现场直播流发布,以及远程调用。Red5依赖RSTP作为流媒体传输...

Global site tag (gtag.js) - Google Analytics