[转]linux下的fms2流媒体服务器搭建六部曲之六-----在线视频录制篇

简介:
    视频录制的源码好像网上有很多,在此声明,我这个也是抄别人的然后改改优化了一下,有点累,不多说了,直接贴源码吧:


var server_uri:String = "rtmp://215.102.25.XX/gdrc/video";
//FMS地址;跟播放器那边设置一样

var videoName:String = "record";//录制的文件名,可以通过参数传递

var my_nc:NetConnection = new NetConnection ();
//新建一个连接对象,用来连接FMS;

my_nc.connect (server_uri);
//连接FMS;

var my_ns:NetStream = new NetStream (my_nc);
//新建流,用来捕获和播放视频;

var my_cam:Camera = Camera.get ();
video_r.attachVideo (my_cam);
//获得慑像头,并将摄像头获取的视频载入到video_r里.

//my_cam.setQuality (1024, 90);
//设置带宽和质量;

var my_mic:Microphone = Microphone.get ();
//获得MIC;

my_ns.attachVideo (my_cam);
my_ns.attachAudio (my_mic);
//将摄像头图象和MIC声音装载到流.

video_p._visible = false;
//将播放窗口设置为不可见.

//默认上网方式为adsl,这个设置需要在服务器端的main.asc添加一些代码,最后补上
updateBandwidth(2);

function updateBandwidth(b) { 
 if ( b == 1 ) { //modem上网方式设置
  my_cam.setMode(160,120,2);0
  my_cam.setQuality(0, 75);
  my_cam.setKeyFrameInterval(3);
  my_mic.setRate(5);
  video_r._height = 100;
  video_r._width = 150;
 } 
 else if ( b == 2 ) { //adsl上网方式设置
  my_cam.setMode(160,120,5);
  my_cam.setQuality(0, 85);
  my_cam.setKeyFrameInterval(5);
  my_mic.setRate(11);
  video_r._height = 130;
  video_r._width = 175;
 } 
 else { //LAN专线上网方式设置
  my_cam.setMode(160,120,15);
  my_cam.setQuality(0, 90);
  my_cam.setKeyFrameInterval(10);
  my_mic.setRate(22);
  video_r._height = 150;
  video_r._width = 200;
 }
 my_ns.call('setBandwidth', 0, b);
}
/*本来做好了几个按钮可以让用户自己选择上网方式,但是实在太丑了就取消了,可以自行添加
Modem_btn.onPress = function() {
 updateBandwidth(1);
}

DSL_btn.onPress = function() { 
 updateBandwidth(2);
}

LAN_btn.onPress = function() {
 updateBandwidth(3);
}
*/

my_nc.onStatus = function (thisObj:Object)
{
 //trace (thisObj.code);
 if (thisObj.code == "NetConnection.Connect.Success")
 {
  RecordStop ("空闲中");
 }
 else
 {
  trace ("错误:服务器未启动或URI输入错误.");
 }
}

function Record ()
{
 video_r._visible = true;
 video_p._visible = false;
 my_ns.publish (videoName, "record");
 StreamInfo ("NowRecord");
 btn_pr.btn_text.text = "停止";
 RecordInterval = setInterval (RecordTime, 1000);
 txt_videoname.text = "视 频 名:" + videoName;
}

var timeNum:Number = 0;

function RecordTime ()
{
 timeNum ++;
 txt_status.text = "正在录制" + " " + "时间:" + Math.floor (timeNum / 60) + "分" + (timeNum % 60) + "秒";
}

function RecordStop (__status:String)
{
 txt_status.text = "当前状态:" + __status;
 btn_pr.btn_text.text = "录制";
 StreamInfo ("NowStop");
 clearInterval (RecordInterval);
 timeNum = 0;
 if (__status == "录制完成")
 {
  Finished ();
 }
 else
 {
  trace ("a");
 }
}


function Finished ()
{
 my_ns.close();
 video_r.clear ();
 var thisObj = this;
 var FinishAlert:MovieClip = _root.attachMovie ("Alert", "FinishAlert", 100);
 with (FinishAlert)
 {
  alertTitle.html = true;
  alertTitle.htmlText = "<b>" + "录制完成!" + "</b>";
  _x = video_r._x + (video_r._width - _width) / 2;
  _y = video_r._y + (video_r._height - _height) / 2;
  info.text = "录制完成..请选择下一步操作."
  btn_sub.btn_txt.text = "播放";
  btn_cln.btn_txt.text = "重录";
  btn_sub.onRelease = function ()
  {
   thisObj.PlayVideo ();
   thisObj.closeAlert (FinishAlert);
  }
  btn_cln.onRelease = function ()
  {
   thisObj.Record ();
   thisObj.closeAlert (FinishAlert);
  }
  closed.onRelease = function ()
  {
   thisObj.closeAlert (FinishAlert);
  }
 }
 btn_pr.enabled = false;
}

function closeAlert (__alert:MovieClip)
{
 btn_pr.enabled = true;
 unloadMovie (__alert);
}

function StreamInfo (__status:String)
{
 btn_pr.onRelease = function ()
 {
  if (__status == "NowRecord")
  {
   RecordStop ("录制完成");
  }
  else if (__status == "NowStop")
  {
   Record ();
  }
  else if (__status == "NowPlay")
  {
   Record ();
  }
 }
}

function PlayVideo ()
{
 txt_status.text = "当前状态:" + "正在播放...";
 StreamInfo ("NowPlay")
 video_r._visible = false;
 video_p._visible = true;
 video_p.attachVideo (my_ns);
 my_ns.play ("record");
 btn_pr.btn_text.text = "重录";
 my_ns.onStatus = function (PlayInfo)
 {
  if (PlayInfo.code == "NetStream.Play.Stop")
  {
   my_ns.seek (0);
   my_ns.pause();
   txt_status.text = "当前状态:" + "播放完成...";
  }
 }
}

服务器端main.asc添加后的完整内容:

load("components.asc");

application.onAppStart = function() {};
application.onConnect = function(client) {
 application.acceptConnection(client);
 client.getFileLength = function(filename) {
  var tlen = Stream.length(filename);
  return tlen;
 };
 
 Client.prototype.setBandwidth = function(bw) { 
   if ( bw == 1 ) { // modem settings
  this.setBandwidthLimit( 35000/8, 22000/8 );
   } 
   else if ( bw == 2 ) { // DSL settings
   this.setBandwidthLimit( 800000/8, 100000/8 );
    } 
    else { // LAN settings
   this.setBandwidthLimit( 400000, 400000 );
    }
  }; 
};


    本文转自 OldHawk  博客园博客,原文链接:http://www.cnblogs.com/taobataoma/archive/2007/10/12/921995.html,如需转载请自行联系原作者




相关文章
|
4天前
|
网络协议 Shell Windows
搭建rtmp流媒体服务器的步骤
网络上很多问文章介绍使用ffmpeg推送和拉流,经常遗漏安装rtsp-simple-server的步骤,执行推流命令:
21 0
|
10天前
|
Linux
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
【Linux】一条命令,转发所有请求到另一台服务器上 -高级技巧
17 0
|
26天前
|
运维 监控 Linux
Linux上面查看服务器压力的一些思路
Linux上面查看服务器压力的一些思路
23 0
|
21天前
|
负载均衡 Linux 应用服务中间件
Linux环境下快速实现两台服务器上的文件夹共享
Linux环境下快速实现两台服务器上的文件夹共享
39 2
Linux环境下快速实现两台服务器上的文件夹共享
|
7天前
|
存储 监控 Linux
性能监控之Telegraf+InfluxDB+Grafana linux服务器实时监控
【6月更文挑战11天】标题性能监控之 Java Metrics 度量包性能监控之Telegraf+InfluxDB+Grafana linux服务器实时监控
22 2
|
8天前
|
Linux 网络安全
|
12天前
|
openCL Linux 异构计算
Linux服务器如何查询GPU型号
【6月更文挑战第13天】Linux服务器如何查询GPU型号
23 1
|
1月前
|
运维 Linux 程序员
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
|
19天前
|
监控 安全 Linux
Linux服务器如何管理sshd的连接
【6月更文挑战第6天】Linux服务器如何管理sshd的连接
19 4
|
21天前
|
运维 Linux Shell
运维:Linux服务器崩了怎么办,快来看看这份”急救命令指南“吧!
当服务器出现问题,如崩溃、内存耗尽或CPU使用率过高时,运维工程师需要保持冷静,并通过一系列Shell命令来诊断和解决。首先,检查是否有异常SSH登录活动,查看`/etc/passwd`和`.bash_history`文件,以及用户最近的登录信息。接着,监控网络连接和端口,使用`netstat`和`lsof`命令找出资源占用高的进程,并查看进程启动时间和详细信息。同时,排查可能的恶意文件,检查定时任务和服务配置以确保没有异常启动项。最后,分析系统日志,如`/var/log`目录下的各种日志文件,找出潜在问题。通过这些步骤,可以有效定位和解决服务器故障。