`

手把手教你做视频直播:音视频直播的实现

阅读更多

开发环境及工具准备:

Adobe Flex Builder 3

FlashMeidaServer 2 及以上(简称:FMS 本人有一个FMS2破解版,需要的话联系我)

 

技能准备:

ActionScript 3 (简称:AS)

 

本功能的实现方式基于FMS为主,ActionScript为辅,双方交互的原则,示意图如下:

 

描述:教师端采集本地摄像头视频及MIC音频通过AS发布到FMS,学生端通过AS连接FMS服务器或者教师传输的音视频数据进行播放。至此为止,即可实现教师的音视频数据共享(即直播效果)。

 

具体实现(教师端):

STEP1:在Flex Application 的creationComplete事件调用init方法

private var conn:NetConnection = new NetConnection();//用来连接FMS
private var stream:NetStream = null;//盛放音视频数据
//FMS连接串(例如:rtmp://192.168.1.101/fmsapp)
//其中需要在FMS_HOME/applications/新建一个fmsapp的文件夹
private var fms:String = "";

private function init():void {
//轨道通信,必须要设置
conn.objectEncoding = ObjectEncoding.AMF0 ;
//共享对象轨道通信设置
SharedObject.defaultObjectEncoding = ObjectEncoding.AMF0; 
//连接FMS服务器
conn.connect(fms) ;
//连接FMS结果事件处理器
conn.addEventListener(NetStatusEvent.NET_STATUS,connectFMS) ;
}

 

 

STEP2:连接FMS成功后,发布音视频数据到FMS服务端

private function connectFMS(e:NetStatusEvent):void {
var result:String = e.info.code ;//连接FMS的返回代码
    switch(result) {
          case "NetConnection.Connect.Success"://连接FMS成功
       playStream();//开发传送音视频数据
       break;
          case "NetStream.Play.StreamNotFound":
          Alert.show( "视频流没有找到");
          break;
         default :
         Alert.show( "连接服务器失败,检查网络环境");
          break ;
        }
}
public var cam1:Camera = null;//摄像头对象
private var mir:Microphone = null;//麦克对象
private function playStream():void {
	stream = new NetStream(conn);//创建于FMS连接相关的音视频数据流对象
           cam1 = Camera.getCamera("0");//获得默认摄像头
           cam1.setMode(320,240,15); //经试验:320*240效果较佳而占用网络流量较小 15为keyFrame
                 cam1.setQuality(100 * 1000,90); //100*1000为上传带宽 90为图像质量
            mir = Microphone.getMicrophone();//获得麦克对象
            mir.setUseEchoSuppression(true);//抑制回声
            stream.attachAudio(mir);//将音频加入到流中
            stream.attachCamera(cam1);//将视频加入到流中
            vd.attachCamera(cam1);//在Flex Application中放一个VideoDisplay对象,用来本地观看图像
            stream.publish("conf","live");//将音视频数据发布到FMS服务器上,流名称为:conf 发布类型为:live(实时)
}

  

至此:教师已将音视频数据发布到FMS。

需要注意的点:摄像头对象的分辨率设置,这样会直接影响到图像的清晰度和传送数据量的大小。

接下来将由学生端对此数据进行读取

STEP1:如教师端STEP1进行相关设置

STEP2:成功连接FMS服务器后,进行音视频数据播放(学生端playStream方法的实现)

stream = new NetStream(conn);//学生端的流对象 conn为NetConnection对象
//学生端的缓冲时间。此参数很重要,很多朋友反应:播放视频不流畅。
//要明确一个观点:没有绝对的实时直播,所谓的直播其实就是在不断的播放缓冲区的数据
stream.bufferTime = 15; 
//按照道理来说这里应该是检测缓冲区的代码
//但本程序为展示直播的核心将此代码略掉,有兴趣的朋友可以问我
v = new Video(); 
v.attachNetStream(stream); //将音视频流附加到video对象中
v.width = vd.width;
v.height = vd.height;
v.smoothing = true;
vd.addChildAt(v,1);//VideoDisplay通过对Video的添加来播放音视频流
stream.play("conf");//播放教师发布的conf流

 

至此,学生将实现音视频流的播放。

需要注意的点:缓冲区的设置,实际应用中应根据实际客户带宽来设置缓冲区大小

 

大家最好找个局域网环境测试下,最好不要在本机测试,这会隐藏很多问题,有什么疑问大家尽管留言!

 

 

---------------------------------------------------------

比较有用的学习FMS的资料

 

基于FMS的远程互动教学系统设计与实现

http://www.docin.com/p-116813055.html

 

 

分享到:
评论
9 楼 726681665 2014-12-28  
正需要
8 楼 zhangguofeng123 2011-11-07  
博主您好:
    请教一个问题
private function playStream():void {  
    stream = new NetStream(conn);//创建于FMS连接相关的音视频数据流对象  
    cam1 = Camera.getCamera("0");//获得默认摄像头  
    cam1.setMode(320,240,15); //经试验:320*240效果较佳而占用网络流量较小 15为keyFrame  
    cam1.setQuality(100 * 1000,90); //100*1000为上传带宽 90为图像质量  
    mir = Microphone.getMicrophone();//获得麦克对象  
    mir.setUseEchoSuppression(true);//抑制回声  
    stream.attachAudio(mir);//将音频加入到流中  
    stream.attachCamera(cam1);//将视频加入到流中  
    vd.attachCamera(cam1);//在Flex Application中放一个VideoDisplay对象,用来本地观看图像  
    stream.publish("conf","live");//将音视频数据发布到FMS服务器上,流名称为:conf 发布类型为:live(实时)  

以上代码是您以摄像的方式将流发布到服务器上。如果我要发布一个现有的视频到服务器上,客户端以同步的方式看录像(有点类似于直播)。这边要怎么样操作呢。。?
7 楼 tqingguang6688 2011-10-29  
楼主你好,最近我在在研究rtmp这方面的,RTMP服务我已经自行实现,通过flex编写的视频直播也挺流畅的,但过了一个小时后,就出现画面跳动现象,关了FLEX客户端,再连就正常了。不知道是什么问题,望交流研究,q:280429608
附flex代码:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;


public class ftest extends Sprite
{
public function ftest()
{
//var params:Object = FlexGlobals.topLevelApplication.parameters;
var fileName:String = "mp4:guang.3gp";
var nc:NetConnection = new NetConnection();
var ns:NetStream;

nc.objectEncoding = flash.net.ObjectEncoding.AMF0;
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);

var counter:int = 0;
function onNetStatus(evt:NetStatusEvent):void {
trace("onNetStatus: "+evt.info.code);
if (evt.info.code =="NetConnection.Connect.Success") {
ns = new NetStream(nc);
ns.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);

var myVideo:Video = new Video(480, 320);
myVideo.attachNetStream(ns);

addChild(myVideo);
myVideo.x = 0;
myVideo.y = 0;

ns.bufferTime = 0;
ns.backBufferTime = 0;

ns.play(fileName, true);
}
}
//nc.connect("rtmp://192.168.9.128/oflaDemo", true);
nc.connect("rtmp://192.168.1.20/oflaDemo", true);
//nc.close();

function asyncErrorHandler(event:AsyncErrorEvent):void{
//ignore error;
}

NetConnection.prototype.onBWDone = function(p_bw) {
trace("onBWDone: "+ p_bw);
};

NetConnection.prototype.onBWCheck = function() {
return ++counter;
}
}


}
}
6 楼 yangpixxxx 2011-09-23  
这也叫“手把手教......”,呵呵,玩笑呐?标题党吧
5 楼 sailei1 2011-01-13  
我觉得 你应该 发个源码在javaeye上  好上大家学习 共同进步!
4 楼 adriny 2010-11-21  
你好,我们公司是一个开发互联网远程教育平台的公司,目前正在尝试开发直播功能,使用FMS来完成,看过了你的帖子,我自己也已经完成了直播流程的实现,但是还是有很多的细节地方没有注意好,就像 你帖子里面说过的缓冲等相关问题都没有仔细考虑,不知道你是不是能够给我一个建议,关于直播需要特别关注的一些性能或其他方面的问题,谢谢!
3 楼 myworkfirst 2010-10-21  
上面是java代码吗?
2 楼 takingoff 2010-08-05  
博主 上一篇博文的屏幕共享实现了吗?
我最近也在做这方面的开发
采用 虚拟摄像头录制屏幕 在flex里加载摄像头 publish到red5或者fms服务器上
效果均不是很好 一卡一卡的
你遇到过类似问题吗?
1 楼 qianlei007 2010-08-05  
可否 提供 代码, 学习一下呢!

相关推荐

    手把手教你DSP配套资料

    “手把手教你DSP配套资料”这一压缩包很可能是包含了一系列关于DSP的学习材料,可能包括教程文档、示例代码、实验指导等。通过这些资料,你可以深入理解DSP的基本原理、算法和应用,逐步掌握实际操作技能,为你的...

    手把手教你学DSP:基于TMS320F28335

    根据提供的标题和描述,本文将围绕“手把手教你学DSP:基于TMS320F28335”这一主题展开,详细讲解数字信号处理(Digital Signal Processing, DSP)的基础概念及其在TMS320F28335处理器上的应用与实践。 ### 数字...

    手把手教你学dsp.pdf

    标题《手把手教你学DSP.pdf》中的DSP指的是数字信号处理器(Digital Signal Processor),它是一种专门用于数字信号处理的微处理器。数字信号处理器在实时快速地完成特定数字信号处理运算方面表现突出,具有处理速度...

    手把手教你直播解决方案.docx

    手把手教你直播解决方案 今天,我们将从头开始,手把手教你直播解决方案。直播带货已经成为2020年的热潮,各家各业都将直播带货拉入了P0的产品需求。老罗的入场是真正的将直播带货这个事儿给完全的行业化了。本文将...

    手把手教你学单片机光盘资料.zip

    《手把手教你学单片机》是一套专为新手设计的单片机学习资源,包含丰富的理论知识与实践操作教程。这个压缩包文件是该学习资料的配套资源,旨在帮助初学者快速掌握单片机的基本原理和编程技巧。 首先,我们看到一个...

    手把手教你学dsp光盘例程

    "手把手教你学dsp光盘例程" 这个标题明确指出,这是一个教学性质的资源集合,专注于数字信号处理(DSP)技术,并且以实例代码的形式呈现。"手把手教你"暗示了这是一套详细的教程,旨在引导初学者逐步理解并掌握DSP的...

    手把手教你抖音短视频带货[视频课程].txt打包整理.zip

    本课程“手把手教你抖音短视频带货”旨在帮助你掌握抖音平台的运营策略和短视频创作技巧,从而实现商品的有效推广和销售。 首先,我们要理解抖音短视频带货的核心在于内容创造。内容是吸引用户的关键,因此你需要...

    手把手教你学DSP配套资料

    【标题】"手把手教你学DSP配套资料"揭示了这个压缩包主要是一个针对数字信号处理(Digital Signal Processing,简称DSP)的学习资源集合。这通常包括教程、实例代码、讲义、习题解答等,旨在帮助初学者或进阶者更好...

    手把手教你学DSP-基于TMS320X281X 458页高清书签版

    《手把手教你学DSP——基于TMS320X281X》是一本深入浅出、详实全面地介绍数字信号处理(Digital Signal Processing,简称DSP)技术的专业书籍,尤其针对德州仪器(Texas Instruments,简称TI)的TMS320X281X系列...

    手把手教你学DSP基于TMS320x281x

    标题“手把手教你学DSP基于TMS320x281x”中蕴含的知识点重点在于数字信号处理器(DSP)的学习方法以及基于特定DSP芯片TMS320x281x系列的学习实践。描述中提到初学者在学习DSP过程中阅读了半个月的存储器相关知识,...

    手把手教你用Python开发抖音表白神器

    这需要利用Python的`pytube`库或其他第三方库来实现,它们可以帮你从URL下载视频并保存到本地。 4. **文本处理**:表白信息的定制化是关键。Python的`string`模块和文本处理函数(如`format`)可以帮助我们构建个性...

    手把手教你学DSP-基于TMS320X281X(高清PDF书签)

    《手把手教你学DSP-基于TMS320X281X》是一本专为初学者设计的数字信号处理(DSP)教程,主要聚焦于TI公司的TMS320C2812系列DSP芯片。这本书以清晰易懂的方式介绍了 DSP 的基本概念和实际应用,特别适合想要入门或者...

    手把手教你学DSP

    通过《手把手教你学DSP》,读者不仅可以学习到DSP的基础理论,还能深入了解其在各种实际应用中的实现细节,从而为成为一名熟练的DSP工程师打下坚实的基础。无论是硬件开发还是软件编程,掌握DSP技术都将极大地拓宽...

    C++实战手把手教您用ffmpeg和QT开发播放器实战视频课程.zip

    本课程同时也适合与想要学习ffmpeg和qt的同学,本课程学完之后你就已经将ffmpeg可以投入实际的项目应用,对于QT的基本原理你也非常清楚了,可以实现复杂的qt界面,您就可以独立开发出音视频的各种应用,包括无人机...

    手把手教你搭建流媒体服务器.doc

    ### 手把手教你搭建流媒体服务器 #### 一、流媒体服务器概述 流媒体服务器是一种特殊的服务器类型,它主要用于提供音频、视频等多媒体文件的实时传输服务。与传统的下载后再观看的方式不同,流媒体技术允许用户在...

    【代码分享】手把手教你:人脸识别的视频打码(基于opencv的人脸打马赛克).rar

    在这个项目中,你将学习到如何结合OpenCV的图像处理功能和计算机视觉技术来实现视频打码。这是一项实用的技能,特别是在处理包含敏感信息的视频时,能够保护个人隐私。通过深入理解这个例子,你可以进一步探索OpenCV...

    手把手教你学flex教程

    Flex可以与Red5配合,实现视频、音频的流传输,以及实时通信等功能。学习如何集成Red5并使用Flex进行数据交互,是进阶Flex开发的重要步骤。 10. 测试与发布: 在开发过程中,使用Flash Builder的内置模拟器或连接到...

    服务器Raid教程:全程图解手把手教你如何做RAID...doc

    适用于对速度要求极高的场景,如音视频存储,但不推荐用于重要数据存储。 2. RAID 1:数据完全镜像,安全性好,但只利用了一半的磁盘容量。适合对数据安全性要求较高的应用,但扩展性较差,扩展容量需同时增加镜像...

Global site tag (gtag.js) - Google Analytics