[英]Recording webcam with flash media server
我正在尝试制作一个允许用户录制视频消息的Web应用程序。 我正在尝试获得最好的质量(即使这意味着较长的上传时间)。 我设法通过ns.publish("livestream", "live");
进行录音ns.publish("livestream", "live");
服务器代码如下所示:
Client.prototype.startRecord = function( source, destination ) {
trace("recording Stream: " + source + " to: " + destination);
this.newStream = Stream.get(destination);
this.fileRecording = destination;
trace(this.fileRecording);
if (this.newStream)
{
this.newStream.onStatus = function (info) {
//trace(info.code );
if (info.code == "NetStream.Play.PublishNotify") {
trace("start recording");
this.record();
}
}
this.newStream.play(source)
}
}
Client.prototype.stopRecord = function() {
trace("stopping Recording");
this.newStream.record(false);
this.newStream.play(false);
}
Client.prototype.getFiles = function() {
var fileRecord = new File("/streams/_definst_/"+this.fileRecording+".flv");
if (fileRecord.exists)
{
return this.fileRecording;
}
return "error recording";
}
application.onConnect = function(clObj) {
this.acceptConnection(clObj);
}
问题是质量不是很好。 我尝试使用ns.publish("livestream", "record");
,但是在服务器上制作2个文件并且质量没有提高,有什么建议吗? 如果您需要,我也可以上传客户端代码。
客户代码:
import flash.media.*;
import flash.events.*;
import flash.net.*;
import flash.utils.getTimer;
var vid:Video;
var mic:Microphone;
var cam:Camera;
var fileListObj:Object = {};
var ns:NetStream;
var nc:NetConnection;
var recordingName:String;
initCamera();
function initCamera ():void
{
if (Camera.isSupported)
{
cam = Camera.getCamera();
cam.setMode (800, 480, 24);
//cam.setQuality(0, 90);
vid = new Video(cam.width,cam.height);
vid.attachCamera (cam);
if (Microphone.isSupported)
{
mic = Microphone.getEnhancedMicrophone();
}
this.addChildAt (vid, 1);
vid.x = (800 - vid.width) >> 1;
vid.y = (480 - vid.height) >> 1;
initConnection();
}
else
{
trace ("no camera");
}
}
function initConnection ():void
{
nc = new NetConnection();
nc.addEventListener (NetStatusEvent.NET_STATUS, netStatusHandler);
nc.addEventListener (AsyncErrorEvent.ASYNC_ERROR, function (event:AsyncErrorEvent):void {trace("error");});
nc.connect ("rtmp://adrian7.srfms.com/nabCapture");
}
function recordVideo (event:MouseEvent):void
{
if (record_mc.label == "Record")
{
record_mc.label = "Stop Record";
var currentTime:Date = new Date();
recordingName = "myRecording"+getTimer()+""+currentTime.time;
nc.call ("startRecord", new Responder(startPublish), "livestream", recordingName);
}
else
{
record_mc.enabled = false;
record_mc.label = "Record";
nc.call ("stopRecord", null);
ns.close();
nc.call ("getFiles", new Responder(onResultFileListObj, null));
}
}
function startPublish (result:Object):void
{
ns.publish("livestream", "live");
}
function netStatusHandler (event:NetStatusEvent):void
{
//trace (event.info.code);
if (event.info.code == "NetConnection.Connect.Success")
{
ns = new NetStream(nc);
ns.attachCamera (cam);
if (mic)
{
ns.attachAudio(mic);
}
record_mc.enabled = true;
record_mc.addEventListener (MouseEvent.CLICK, recordVideo);
}
}
function onResultFileListObj (resultObj:Object):void
{
if (String(resultObj) != "error recording")
{
recordingName = String(resultObj);
see_mc.enabled = true;
see_mc.addEventListener(MouseEvent.CLICK, function (event:MouseEvent):void {
navigateToURL(new URLRequest("http://www.labs.adrian281990.com/fms_demo1/index.php?id=" + recordingName), "_self");
});
}
}
您应该首先进行以下更改:
cam.setQuality
设置,并使用cam.setQuality(0,90)
以上翻译为以下客户端AS3代码:
cam.setMode (640, 480, 24);
cam.setQuality(0, 90);
cam.setMode(640,480,24);
发生的情况是您当前正在从网络摄像头请求800x480 @ 24fps。 800x480 @ 24fps并非广泛支持的分辨率,这意味着在大多数网络摄像头中,您将获得网络摄像头响应的所有内容(这可能不是最佳质量)。 要求使用640 x 480 @ 30fps之类的通用分辨率,可以确保您在大多数网络摄像头上都能得到满意的分辨率。
cam.setQuality(0, 90);
对cam.setQuality
进行了注释,这意味着它将使用默认值转换为:更改图片质量,以将比特率保持在130kbits / s(或16384bytes / second)以下。
130kbits / s非常低。 使用cam.setQuality(0, 90)
告诉Flash使用所需的带宽以将图片质量保持在90。
有关更多信息,请参见Camera.SetQuality文档。
如果使用Red5,则应确保至少使用Red5 1.0.3 。 这是固定视频录制的第一个版本。 所有以前的版本都中断了视频录制,有关详细信息,请参阅此问题 。
您还应该考虑使用诸如HDFVR或Pipe之类的商业解决方案,该解决方案可以处理包括移动设备和转换为.mp4在内的所有内容。
但是它在服务器上制作了2个文件并且质量没有提高
根据您使用的媒体服务器,您可能会获得1个,2个或更多文件。
例如, Red5将在录制过程中创建另外两个文件(.ser和.info):
在第一次播放之后,它将创建另一个.meta文件,其中包含关键帧列表,其字节位置和时间戳:
这是.meta文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<FrameMetadata audioOnly="false" duration="24074" modified="1446217872000">
<KeyFrame position="566" timestamp="39"/>
<KeyFrame position="626" timestamp="40"/>
<KeyFrame position="14705" timestamp="574"/>
<KeyFrame position="14765" timestamp="575"/>
...
</FrameMetadata>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.