`
baobeituping
  • 浏览: 1068531 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Red5学习笔记(3)

阅读更多

根据网上的代码,自己整理了一下,做了一个录像的客户端。

 

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"    
  3.     creationComplete="init()">  
  4.     <mx:Script>    
  5.         <![CDATA[   
  6.             import mx.controls.Alert;   
  7.             private var nc:NetConnection = null;  
  8.             private var ns:NetStream = null;  
  9.             private var video:Video = null;  
  10.             private var camera:Camera = null;//定义一个摄像头   
  11.             private var mic:Microphone; //定义一个麦克风   
  12.               
  13.             private var rtmp_url:String = "rtmp://192.168.61.115/red5_app";  
  14.             private var videoName:String = ""; //视频保存名字  
  15.               
  16.             private function init():void{  
  17.                 //nc = new NetConnection();  
  18.                 setupCameraAndMic();  //该方法表示初始化摄像头和麦克风,代码以后都可以直接复制用
  19.             }  
  20.               
  21.             private function setupCameraAndMic():void{  
  22.                 camera = Camera.getCamera();  
  23.                 if(camera != null){  
  24.                     camera.addEventListener(StatusEvent.STATUS,cameraStatus);  
  25.                     camera.setMode(320,240,30);  
  26.                     camera.setQuality(0,70);  
  27.                     video = new Video();  
  28.                     video.width = 320;  
  29.                     video.height = 240;  
  30.                     video.attachCamera(camera);  
  31.                     videoPlay.addChild(video);  
  32.                 }  
  33.                 mic = Microphone.getMicrophone();   
  34.                 if(mic != null){   
  35.                     mic.addEventListener(StatusEvent.STATUS,micStatus);  
  36.                     mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据   
  37.                     mic.gain = 80; //设置麦克风声音大小   
  38.                 }   
  39.             }  
  40.               
  41.             private function cameraStatus(event:StatusEvent):void{  
  42.                 if(!camera.muted){  
  43.                     startRecord.enabled = true;  
  44.                     //error_label.text = error_label.text + "1";  
  45.                 }else{  
  46.                     error_label.text = error_label.text + "  无法找到摄像头"  
  47.                 }  
  48.                 //camera.removeEventListener(StatusEvent.STATUS,cameraStatus);  
  49.             }  
  50.               
  51.             /* 好像麦克风没法检测,测试过拔掉麦克风,但是没效果 */  
  52.             private function micStatus(event:StatusEvent):void{  
  53.                 if(!mic.muted){  
  54.                     startRecord.enabled = true;  
  55.                     //error_label.text = error_label.text + "2";  
  56.                 }else{  
  57.                     error_label.text = error_label.text + "  无法找到麦克风";  
  58.                 }  
  59.                 //mic.removeEventListener(StatusEvent.STATUS,micStatus);  
  60.             }  
  61.               

                     //以上代码都是直接复制过来用的,通用的,下面的代码才是真正要写的

  1.             /*点击 开始录像 按钮*/  
  2.             private function clickStartRecord():void{  
  3.                 nc = new NetConnection();  
  4.                 nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);  
  5.                 nc.connect(rtmp_url); //连接red5  
  6.                 //doStart();  
  7.             }  
  8.               
  9.             private function nsHandler(evt:NetStatusEvent):void{  
  10.                 if(evt.info.code == "NetConnection.Connect.Success"){ //如果连接成功  
  11.                     doStart();  
  12.                 }else{  
  13.                     Alert.show("连接失败");  
  14.                 }  
  15.             }  
  16.               
  17.             /*开始录像*/  
  18.             private function doStart():void{  
  19.                 if(video != null){  
  20.                     video.clear();  
  21.                     videoPlay.removeChild(video);  
  22.                     video = new Video();  
  23.                     video.width = 320;  
  24.                     video.height = 240;  
  25.                     video.attachCamera(camera);  
  26.                     videoPlay.addChild(video);  
  27.                 }  
  28.                 ns = new NetStream(nc);  
  29.                 ns.attachCamera(camera);  
  30.                 ns.attachAudio(mic);  
  31.                 videoName = "tuping_"+Math.random()+getTimer();  
  32.                 ns.publish(videoName,"record");  
  33.                 startRecord.enabled = false;  
  34.                 stopRecord.enabled = true;  
  35.             }  
  36.               
  37.             private function clickStopRecord():void{  
  38.                 ns.close();  
  39.                 video.clear();  
  40.                 videoPlay.removeChild(video);  
  41.                 startRecord.enabled = true;  
  42.                 stopRecord.enabled = false;  
  43.                 init();/*重新初始化Camera,否则Camera会默认使用完了,不再显示图像*/  
  44.             }  
  45.         ]]>    
  46.     </mx:Script>    
  47.     <mx:Panel x="213" y="175" width="360.5" height="301" layout="absolute">  
  48.         <mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoPlay"/>  
  49.     </mx:Panel>  
  50.     <mx:Button x="270" y="498" label="开始录像" id="startRecord"    
  51.         click="clickStartRecord()" enabled="false"/>  
  52.     <mx:Button x="432" y="498" label="停止录像" id="stopRecord"    
  53.         click="clickStopRecord()" enabled="false"/>  
  54.     <!--  
  55.     <mx:Button x="442" y="498" label="播放录像" id="playRecord" enabled="false"/>  
  56.     -->  
  57.     <mx:Label text="错误:" x="213" y="544" width="360.5" height="25"    
  58.         id="error_label" fontSize="12"/>  
  59.        
  60. </mx:Application>  
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
	creationComplete="init()">
	<mx:Script> 
		<![CDATA[ 
			import mx.controls.Alert; 
			private var nc:NetConnection = null;
			private var ns:NetStream = null;
			private var video:Video = null;
			private var camera:Camera = null;//定义一个摄像头 
			private var mic:Microphone; //定义一个麦克风 
			
			private var rtmp_url:String = "rtmp://192.168.61.115/red5_app";
			private var videoName:String = ""; //视频保存名字
			
			private function init():void{
				//nc = new NetConnection();
				setupCameraAndMic();
			}
			
			private function setupCameraAndMic():void{
				camera = Camera.getCamera();
				if(camera != null){
					camera.addEventListener(StatusEvent.STATUS,cameraStatus);
					camera.setMode(320,240,30);
					camera.setQuality(0,70);
					video = new Video();
					video.width = 320;
					video.height = 240;
					video.attachCamera(camera);
					videoPlay.addChild(video);
				}
				mic = Microphone.getMicrophone(); 
				if(mic != null){ 
					mic.addEventListener(StatusEvent.STATUS,micStatus);
					mic.setSilenceLevel(0,-1); //设置麦克风保持活动状态并持续接收集音频数据 
					mic.gain = 80; //设置麦克风声音大小 
				} 
			}
			
			private function cameraStatus(event:StatusEvent):void{
				if(!camera.muted){
					startRecord.enabled = true;
					//error_label.text = error_label.text + "1";
				}else{
					error_label.text = error_label.text + "  无法找到摄像头"
				}
				//camera.removeEventListener(StatusEvent.STATUS,cameraStatus);
			}
			
			/* 好像麦克风没法检测,测试过拔掉麦克风,但是没效果 */
			private function micStatus(event:StatusEvent):void{
				if(!mic.muted){
					startRecord.enabled = true;
					//error_label.text = error_label.text + "2";
				}else{
					error_label.text = error_label.text + "  无法找到麦克风";
				}
				//mic.removeEventListener(StatusEvent.STATUS,micStatus);
			}
			
			/*点击 开始录像 按钮*/
			private function clickStartRecord():void{
				nc = new NetConnection();
				nc.addEventListener(NetStatusEvent.NET_STATUS,nsHandler);
				nc.connect(rtmp_url); //连接red5
				//doStart();
			}
			
			private function nsHandler(evt:NetStatusEvent):void{
				if(evt.info.code == "NetConnection.Connect.Success"){ //如果连接成功
					doStart();
				}else{
					Alert.show("连接失败");
				}
			}
			
			/*开始录像*/
			private function doStart():void{
				if(video != null){
					video.clear();
					videoPlay.removeChild(video);
					video = new Video();
					video.width = 320;
					video.height = 240;
					video.attachCamera(camera);
					videoPlay.addChild(video);
				}
				ns = new NetStream(nc);
				ns.attachCamera(camera);
				ns.attachAudio(mic);
				videoName = "vincent_"+Math.random()+getTimer();
				ns.publish(videoName,"record");
				startRecord.enabled = false;
				stopRecord.enabled = true;
			}
			
			private function clickStopRecord():void{
				ns.close();
				video.clear();
				videoPlay.removeChild(video);
				startRecord.enabled = true;
				stopRecord.enabled = false;
				init();/*重新初始化Camera,否则Camera会默认使用完了,不再显示图像*/
			}
		]]> 
	</mx:Script> 
	<mx:Panel x="213" y="175" width="360.5" height="301" layout="absolute">
		<mx:VideoDisplay x="10" y="10" width="320" height="240" id="videoPlay"/>
	</mx:Panel>
	<mx:Button x="270" y="498" label="开始录像" id="startRecord" 
		click="clickStartRecord()" enabled="false"/>
	<mx:Button x="432" y="498" label="停止录像" id="stopRecord" 
		click="clickStopRecord()" enabled="false"/>
	<!--
	<mx:Button x="442" y="498" label="播放录像" id="playRecord" enabled="false"/>
	-->
	<mx:Label text="错误:" x="213" y="544" width="360.5" height="25" 
		id="error_label" fontSize="12"/>
	
</mx:Application>

 如果你使用Flex builder 开发,那相当简单!可以直接运行,记着插上摄像头哦!

 

忘记吧web.xml 的配置写上了,其实可以复制red5里面的例子工程,但是补上吧,怕太久了忘记了。

 

 

Xml代码 复制代码
  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <web-app    
  3.    xmlns="http://java.sun.com/xml/ns/j2ee"    
  4.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"    
  6.    version="2.4">    
  7.   
  8.     <display-name>Red5App</display-name>  
  9.        
  10.     <context-param>  
  11.         <param-name>Red5App</param-name>  
  12.         <param-value>/red5_app</param-value>  
  13.     </context-param>  
  14. <listener>  
  15.         <listener-class>org.red5.logging.ContextLoggingListener</listener-class>  
  16.     </listener>  
  17.        
  18.     <filter>  
  19.         <filter-name>LoggerContextFilter</filter-name>  
  20.         <filter-class>org.red5.logging.LoggerContextFilter</filter-class>  
  21.     </filter>  
  22.        
  23.     <filter-mapping>  
  24.         <filter-name>LoggerContextFilter</filter-name>  
  25.         <url-pattern>/*</url-pattern>  
  26.     </filter-mapping>  
  27.        
  28.     <servlet>  
  29.         <servlet-name>rtmpt</servlet-name>  
  30.         <servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>  
  31.         <load-on-startup>1</load-on-startup>  
  32.     </servlet>  
  33.     <!--   
  34.     <servlet>  
  35.         <display-name>SecurityTest</display-name>  
  36.         <servlet-name>SecurityTest</servlet-name>  
  37.         <servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class>  
  38.     </servlet>  
  39.     -->  
  40.     <servlet-mapping>  
  41.         <servlet-name>rtmpt</servlet-name>  
  42.         <url-pattern>/fcs/*</url-pattern>  
  43.     </servlet-mapping>  
  44.   
  45.     <servlet-mapping>  
  46.         <servlet-name>rtmpt</servlet-name>  
  47.         <url-pattern>/open/*</url-pattern>  
  48.     </servlet-mapping>  
  49.   
  50.     <servlet-mapping>  
  51.         <servlet-name>rtmpt</servlet-name>  
  52.         <url-pattern>/close/*</url-pattern>  
  53.     </servlet-mapping>  
  54.   
  55.     <servlet-mapping>  
  56.         <servlet-name>rtmpt</servlet-name>  
  57.         <url-pattern>/send/*</url-pattern>  
  58.     </servlet-mapping>  
  59.   
  60.     <servlet-mapping>  
  61.         <servlet-name>rtmpt</servlet-name>  
  62.         <url-pattern>/idle/*</url-pattern>  
  63.     </servlet-mapping>  
  64.     <!--   
  65.     <servlet-mapping>  
  66.         <servlet-name>SecurityTest</servlet-name>  
  67.         <url-pattern>/securitytest</url-pattern>  
  68.     </servlet-mapping>  
  69.     -->  
  70. <!--       
  71.     <security-constraint>  
  72.         <web-resource-collection>  
  73.             <web-resource-name>Forbidden</web-resource-name>  
  74.             <url-pattern>/streams/*</url-pattern>  
  75.         </web-resource-collection>  
  76.         <auth-constraint/>  
  77.     </security-constraint>  
  78. -->     
  79. </web-app>  
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 
   xmlns="http://java.sun.com/xml/ns/j2ee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
   version="2.4"> 

	<display-name>Red5App</display-name>
	
	<context-param>
		<param-name>Red5App</param-name>
		<param-value>/red5_app</param-value>
	</context-param>
<listener>
        <listener-class>org.red5.logging.ContextLoggingListener</listener-class>
    </listener>
    
    <filter>
        <filter-name>LoggerContextFilter</filter-name>
        <filter-class>org.red5.logging.LoggerContextFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>LoggerContextFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
   	<servlet>
		<servlet-name>rtmpt</servlet-name>
		<servlet-class>org.red5.server.net.rtmpt.RTMPTServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!--
   	<servlet>
   		<display-name>SecurityTest</display-name>
   		<servlet-name>SecurityTest</servlet-name>
   		<servlet-class>org.red5.demos.oflaDemo.SecurityTest</servlet-class>
   	</servlet>
    -->
	<servlet-mapping>
		<servlet-name>rtmpt</servlet-name>
		<url-pattern>/fcs/*</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>rtmpt</servlet-name>
		<url-pattern>/open/*</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>rtmpt</servlet-name>
		<url-pattern>/close/*</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>rtmpt</servlet-name>
		<url-pattern>/send/*</url-pattern>
	</servlet-mapping>

	<servlet-mapping>
		<servlet-name>rtmpt</servlet-name>
		<url-pattern>/idle/*</url-pattern>
	</servlet-mapping>
	<!--
	<servlet-mapping>
		<servlet-name>SecurityTest</servlet-name>
		<url-pattern>/securitytest</url-pattern>
	</servlet-mapping>
	-->
<!--    
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Forbidden</web-resource-name>
            <url-pattern>/streams/*</url-pattern>
        </web-resource-collection>
        <auth-constraint/>
    </security-constraint>
-->	
</web-app>

 

这个配置挺全了。以后可以继续使用的!

分享到:
评论

相关推荐

    red5 学习笔记 随便写的一些东西

    red5 学习笔记 随便写的一些东西,没多大用,有点乱,看着下载吧。

    red hat linux 9讲义及学习笔记(基础)

    **Red Hat Linux 9 讲义及学习笔记(基础)** Red Hat Linux 9 是一款历史悠久的开源操作系统,它是基于Linux内核的发行版,专为服务器和工作站环境设计。这款系统以其稳定性、安全性和易用性而备受赞誉,尤其适合...

    Javajdk5学习笔记

    以下是对"Javajdk5学习笔记"中可能包含的知识点的详细解析: 1. **自动装箱与拆箱**:JDK 5引入了自动装箱和拆箱功能,使得基本类型和它们对应的包装类之间可以无缝转换,提高了代码的简洁性。例如,`Integer i = ...

    良葛格JDK5学习笔记

    **良葛格JDK5学习笔记** 在Java编程领域,JDK5是一个重要的里程碑,它引入了许多创新特性,极大地提升了开发效率和代码质量。本文将深入探讨这些关键知识点,为初学者提供一个全面的JDK5学习指南。 一、自动装箱与...

    兄弟连linux教程1-16章学习笔记(全)

    3. **学习笔记结构**:教程按照章节顺序展开,从基础到进阶,包括了从第一章到第十六章的内容。章节涵盖了从安装Linux系统,到基本命令操作,再到系统管理等各个方面。 4. **命令行操作**:在"兄弟连linux教程1-5章...

    css经典学习笔记.zip

    《CSS经典学习笔记》 CSS(Cascading Style Sheets)是网页设计中不可或缺的一部分,它负责定义网页内容的样式和布局。本学习笔记将深入探讨CSS的核心概念、选择器、盒模型、布局方式以及响应式设计等多个方面,...

    GlusterFS学习笔记.docx

    GlusterFS 学习笔记 GlusterFS 是一种开源的分布式文件系统,它可以将多个硬盘组合成一个大型存储系统,提供高性能、可扩展性和高可用性的存储解决方案。下面是 GlusterFS 的一些重要知识点: 1. Raid 概念 Raid...

    Java JDK 5.0学习笔记

    本学习笔记旨在帮助新手全面理解并掌握Java 5.0的关键知识点。 一、泛型(Generics) Java 5.0引入了泛型,它允许在定义类、接口和方法时指定类型参数,从而实现类型安全的集合。泛型消除了强制类型转换的需要,...

    HTML基础学习笔记

    在“HTML基础学习笔记”中,我们可以深入理解HTML的基本结构、样式控制、超链接、图像和表格的使用,以及列表的创建。 首先,HTML的基本结构由`&lt;html&gt;`、`&lt;head&gt;`和`&lt;body&gt;`三个主要部分组成。`&lt;html&gt;`是整个文档的...

    Red5研究学习(1)

    Red5是一款开源的流媒体服务器,它基于几个关键的技术组件构建,包括Jetty、Mina和...通过对Red5的学习和研究,我们可以深入了解流媒体服务的运作机制,并掌握如何利用这些工具来满足各种复杂的在线视频和音频需求。

    Linux 学习笔记 (强烈推荐)

    这份“Linux学习笔记”涵盖了多个关键主题,旨在帮助初学者及进阶用户深入理解和掌握Linux系统。 《Linux一句话精彩问答.doc》可能包含了一系列关于Linux日常使用、命令行操作、系统管理等方面的简洁问答,比如如何...

    qt 学习笔记 qt学习笔记

    ### Qt学习笔记知识点详解 #### 一、从Hello Qt开始 **知识点1:Qt程序的基本结构** - **头文件引入**: - 第1行和第2行代码中,`#include &lt;QApplication&gt;` 和 `#include &lt;QLabel&gt;` 是引入Qt中的两个类:`...

    Redhat Enterprise linux5学习笔记

    ### Redhat Enterprise Linux 5 学习笔记知识点总结 #### 一、Linux系统介绍与安装 **1. Linux的历史背景与发展** - **UNIX系统的诞生**:1970年,贝尔实验室的两位科学家发明了UNIX系统,这标志着现代操作系统的...

    html和css学习笔记

    ### HTML与CSS学习笔记 #### 一、基础知识概述 HTML(HyperText Markup Language)与CSS(Cascading Style Sheets)是构建网页的基础技术。通过学习HTML与CSS,我们可以创建结构化且美观的网页。 - **WWW (World ...

    Linux 学习笔记 Linux 学习笔记

    Linux学习笔记 Linux学习笔记是一个关于Linux操作系统的学习笔记,涵盖了Linux的基本概念、安装、配置、命令和应用等方面的知识点。 一、 Linux基本概念 * Linux是一种开源的操作系统,具有安全、稳定的特点。 * ...

    Linux Raid 5 扩容学习笔记(精排编目)

    ### Linux RAID 5 扩容学习笔记 #### 一、概览 本文档是一份针对Linux环境下RAID 5配置与动态扩容的学习笔记。主要内容包括如何动态地向现有的RAID 5组中添加新的硬盘、如何对新硬盘进行格式化并将其加入到RAID 5...

    韩顺平linux学习笔记

    韩顺平 Linux 学习笔记 本学习笔记涵盖了 Linux 的基础知识、Samba 服务的搭建、Web 项目的开发和发布等内容。学习笔记分为多个阶段,从基础的 Linux 平台开发到高级的 Unix 环境编程,并涉及到 Linux 应用系统开发...

    GCC 学习 笔记GCC学习笔记

    ### GCC 学习笔记知识点详解 #### 一、GCC简介与版本检查 - **GCC**(GNU Compiler Collection)是一款开源的编译器集合,广泛应用于Linux等类Unix系统上,支持多种编程语言如C、C++等。 - **版本检查**: - 要...

Global site tag (gtag.js) - Google Analytics