[原]用RED5做直播

标签: | 发表时间:2015-08-13 22:05 | 作者:supercrsky
出处:http://blog.csdn.net/supercrsky

服务端用Java web或red5 server即可,直播和收看都是用Flash Builder 4做的flash。
先看效果图:
这里写图片描述
这里写图片描述

red5最新版已经更新到1.0.5 ,需要JDK8的支持。RED5主页: https://github.com/Red5

服务器端用Java做web工程,主类继续ApplicationAdapter 空实现即可。
当然你也可以不用做java工程,在 https://github.com/Red5/red5-server
下载和你本机对应的版本,一般0.8以后即可,最新是1.0.5。需要注意的1.0.5必须安装JDK8来支持。

  package org;

import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;

public class Application extends ApplicationAdapter {

    @Override
    public synchronized boolean connect(IConnection conn, IScope scope,
            Object[] params)
    {
        System.out.println("新连接......."+conn.isConnected()+"........."+params.length);
        return super.connect(conn, scope, params);
    }


    @Override
    public synchronized boolean join(IClient client, IScope scope)
    {
        return super.join(client, scope);
    }

    @Override
    public synchronized void leave(IClient client, IScope scope)
    {
        super.leave(client, scope);
    }

    @Override
    public synchronized boolean start(IScope scope)
    {
        // TODO Auto-generated method stub
        return super.start(scope);
    }

    @Override
    public synchronized void stop(IScope scope)
    {
        super.stop(scope);
    }

    @Override
    public void disconnect(IConnection conn, IScope scope) {
        System.out.println("断开连接......."+conn.isConnected());
    }

}

下面是Flex代码:
发布直播端:

  <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="init()"  >
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            private var nc:NetConnection ;
            private var cam:Camera ;
            private var mic:Microphone;
            private var ns:NetStream;

            /***
             *** 初始化的方法,默认显示摄像头实时图像,不发布和录像
             * ***/
            private function init():void
            {
                cam = Camera.getCamera();
                var vi:Video = new Video();
                vi.width = 313;
                vi.height = 194;
                vi.attachCamera(cam);
                videoDisplay.addChild(vi);
            }
            /***
             *** 发布直播并录制的方法 
             ***/           
            private function playClick():void
            {
                playButton.enabled = false;
                stopButton.enabled = true;
                recordCheck.enabled = false;
                //之前有连接,先关闭
                try{ 
                    if(nc.connected){ 
                        nc.close(); 
                    } 
                }catch(e:Error){} 
                nc = new NetConnection();
                nc.addEventListener(NetStatusEvent.NET_STATUS,connectHandler);
                nc.client  = this;
                //实例名称
                nc.connect("rtmp://localhost/player");
            }

            private function connectHandler(evt:NetStatusEvent):void{
                trace(evt.info.code);
                //由于flash的异步机制,连接成功后才能做处理,否则NetStream会因为conn没能连接报参数错误#2126
                if (evt.info.code == 'NetConnection.Connect.Success') {
                    ns = new NetStream(nc);
                    cam = Camera.getCamera();
                    if(cam == null)
                    {
                        Alert.show("没有发现摄像头","提示")
                    }
                    mic = Microphone.getMicrophone();

                    setupCameraMic();
                    ns.attachAudio(mic);
                    ns.attachCamera(cam);

                    var vi:Video = new Video();
                    vi.width = videoDisplay.width;
                    vi.height = videoDisplay.height;
                    vi.attachCamera(cam);
                    videoDisplay.addChild(vi);
                    // live 直播不录制, record 边直播边录制
                    ns.publish("ok", recordCheck.selected?"record":"live");
                }
                else
                {
                    Alert.show("直播服务器繁忙,请稍候再试","提示")
                }
            }
            /***
             ***设置摄像头和麦克风的参数
             ***/           
            private function setupCameraMic():void
            {
                cam = Camera.getCamera();
                cam.setMode(320, 240, 30);
                cam.setQuality(0,70);
                mic = Microphone.getMicrophone();

            }

            /***
             ***停止直播
             ***/
            private function stopClick():void
            {
                nc.close();
                ns.close();
                playButton.enabled = true;
                stopButton.enabled = false;
                recordCheck.enabled = true;
            }


        ]]>
    </fx:Script>
    <fx:Declarations></fx:Declarations>
    <s:Panel x="66" y="29" title="发布直播" width="534" height="319">
        <s:VideoDisplay  x="6" y="10" width="370" height="262" id="videoDisplay" />
        <s:Button label="开始" id="playButton" click="playClick();" x="384" y="24"/>
        <s:Button label="停止" x="384" y="68"  id="stopButton" click="stopClick();"/>
        <s:CheckBox x="469" y="25" label="录制" width="53" id="recordCheck"/>
    </s:Panel>
</s:Application>

收看直播端:

  <?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            private var nc:NetConnection;
            private var ns:NetStream;

            private function init():void{
                playButton.enabled = false;
                stopButton.enabled = true
                //之前有连接,先关闭
                try{ 
                    if(nc.connected){ 
                        nc.close(); 
                    } 
                }catch(e:Error){} 
                nc = new NetConnection();
                nc.client  = this;
                nc.addEventListener(NetStatusEvent.NET_STATUS,connectHandler);
                nc.connect("rtmp://localhost/player");
            }

            private function connectHandler(evt:NetStatusEvent):void{
                if (evt.info.code == 'NetConnection.Connect.Success') {
                    ns = new NetStream(nc);
                    var video:Video=new Video() ;
                    video.width = videoDisplay.width;
                    video.height = videoDisplay.height;
                    video.attachNetStream(ns);
                    //这里的名称要和服务端ns.publish方法中的名称一致
                    ns.play("ok");
                    videoDisplay.addChild(video);
                }
                else
                {
                    Alert.show("没有发现直播节目","提示"); 
                }
            }
            /***
             ***停止收看直播
             ***/
            private function stopClick():void
            {
                nc.close();
                ns.close();
                playButton.enabled = true;
                stopButton.enabled = false;
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
    </fx:Declarations>
    <s:Panel x="132" y="78" width="496" height="257" title="收看现场直播" fontSize="14" >
        <s:VideoDisplay x="164" y="10" width="320" height="193" id="videoDisplay"/>
        <s:Button x="10" y="24" label="收看" id="playButton" click="init()"/>
        <s:Button x="10" y="75" label="停止"  id="stopButton" click="stopClick()" />
    </s:Panel>
</s:Application>

需要注意的
nc.connect(“rtmp://localhost/player”);
这里连接的是rtmp server的地址和实例,如果用我提供的附件的话实例名称 就是player,可以在root-web.xml中进行配置。如果你下载的是官方的server,实例名称是oflaDemo。这两处必须保持一致。

      <bean id="web.scope" class="org.red5.server.WebScope" init-method="register">
        <property name="server" ref="red5.server" />
        <property name="parent" ref="global.scope" />
        <property name="context" ref="web.context" />
        <property name="handler" ref="player.handler" />
        <property name="contextPath" value="/player" />
        <property name="virtualHosts" value="*,localhost, localhost:9449, 127.0.1.1:9449" />
    </bean>

当然,此示例你必须要有摄像头才能正常运行。

示例代码下载

作者:supercrsky 发表于2015/8/13 14:05:16 原文链接
阅读:38 评论:0 查看评论

相关 [red5 直播] 推荐:

[原]用RED5做直播

- - 上善若水 厚德载物
服务端用Java web或red5 server即可,直播和收看都是用Flash Builder 4做的flash. red5最新版已经更新到1.0.5 ,需要JDK8的支持. RED5主页: https://github.com/Red5. 服务器端用Java做web工程,主类继续ApplicationAdapter 空实现即可.

Red5 1.0 RC1 与tomcat 6 整合

- - CSDN博客互联网推荐文章
1.0以上版本没整合成功过,如有人整合成功过,也分享下,在此先谢谢. 一.下载red5-1.0.0-RC1.zip.    下载地址: http://code.google.com/p/red5/ 和 http://red5.org/downloads/red5/1_0/. 解压red5-1.0.0-RC1.zip  为 red5-1.0.0-RC1 并解压里面的src.zip 为目录src.

Red5 1.0.1 Final 发布,Flash流媒体服务器

- - 开源中国社区最新新闻
Red5是一个采用Java开发开源的Flash流媒体服务器. 它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用. Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能.

现场直播

- 纸条 - 新闻跟帖局
核心提示:8月29日上午,福建气象台发布“沿海地区台风警报”与“台风黄色预警信号”称,台风“南玛都”可能于30日白天在福建省中南部沿海登陆. 受台风影响,福建自29日起3日内多地将有大雨到暴雨. [查看原文]好友向您推荐这条跟贴. 网易福建省泉州市网友 [小小小书童] 的原贴:1. 你好,主持人,我现在在泉州惠安西沙湾,现在风力非常大,屁股对准海边保你菊花都被吹开,现场的情况就是这样,现在把画面交给演播室.

E3大展直播

- 杯子 - 译言-电脑/网络/数码科技
来源Live from Microsoft\'s E3 2011 keynote!.   1:59PM 是否期待今年用声控操作Xbox上的一切呢.   1:58PM 2012年假期发布.    1:57PM Xbox 360新纪元即将到来  .   1:56PM 使命召唤的下载内容将会首先登陆XBOX 360.

HTML5 视频直播(一)

- - JerryQu 的小站
前不久工作中遇到了在移动 WEB 端直播视频的需求,研究了一下相关技术,记录一下. 目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前就只有 HLS 能用,我们重点介绍它. HTTP Live Streaming(简称 HLS)是一个基于 HTTP 的视频流协议,由 Apple 公司实现,Mac OS 上的 QuickTime、Safari 以及 iOS 上的 Safari 都能很好的支持 HLS,高版本 Android 也增加了对 HLS 的支持.

Web 直播流的解析

- - IT瘾-geek
Web 进制操作是一个比较底层的话题,因为平常做业务的时候根本用不到太多,或者说,根本用不到. 现在比较流行的就是音视频的处理,怎么说呢. 如果,有涉及直播的话,那么这应该就是一个非常. 我这里就不废话了,先主要看一下里面的基础内容. 首先,一开始我们是怎么接触到底层的 bit 流呢. 记住:只有一个对象我们可以搞到 bit 流 --> ArrayBuffer.

WebRTC 点对点直播

- - SegmentFault 最新的文章
摘自: villainhr. WebRTC 全称为: Web Real-Time Communication. 它是为了解决 Web 端无法捕获音视频的能力,并且提供了 peer-to-peer(就是浏览器间)的视频交互. 实际上,细分看来,它包含三个部分:. MediaStream:捕获音视频流.

[直播]正直播CNN乔布斯逝世特别报道

- 洞箫 - cnBeta.COM
现在正在直播美国CNN的乔布斯逝世特别报道. 点击进入直播间(iOS用户暂不可观看)(海外入口).

YouTube 将直播威廉王子婚礼

- Xanade - 谷奥——探寻谷歌的奥秘
先生们,女士们,史上最豪华的婚礼,威廉王子和他的灰姑娘的婚礼即将在本月底举行,这一事件吸引了世界范围内许多人的目光. Google搜索显示,除了英国和美国外,搜索这场婚礼最多的十个国家中就有像新加坡、菲律宾. 为了配合这次大婚,Google Earth之前就做了充分的准备,在伦敦大面积植树,这在谷奥之前的文章中已经介绍过.