我们正在利用Adobe FMS 4.5录制来自用户网络摄像头的视频。我们不是直播这个视频,我们只想捕获它并将其保存在服务器上以便以后使用它(附加到用户帐户,显示为页内内容等)。
我们编写了一个强大的捕获应用程序,可以流式传输到服务器,正确取消发布,并允许用户在完成取消发布后查看视频等。这似乎有效,因为它保存视频文件,因为我们期望的。
问题是那些录制的视频在开始时似乎有一个小的差距。它不到一秒钟。我们说的可能是没有视频数据的5 / 100s到1/10秒。在视频的最开始看起来似乎没有视频关键帧。
现在,这通常不会成为一个问题 - 视频刚刚开始播放,并且在大多数播放器中都能正常播放。问题是,我们允许用户稍后使用不同的工具任意修剪视频 - FFmpeg的自定义可视界面。如果他们在第一个关键帧之前开始视频修剪,那么最终输出中会出现一个丑陋的灰色混乱,因为在FFmpeg开始切割的区域中没有可视数据。
我的第一个想法是,“哦,我必须要连接相机(不同点|在某些回调|等等)”。我在调用发布之前,在NetStream.Publish.Start等之后附加了相机。
我错过了内在的东西吗?或者我只是在用错误的想法,或者我是否误解了这个过程?
当然,我完全期待但不想要的答案是,“这就是FMS如何做到的。” :)我们可以添加一个服务器端进程来删除视频的第一个XX位,但它是任意的;我们不知道要削减多少,我们不想冒失去任何用户数据的风险。
以下是我们使用的代码的概括:
private function init():void
{
var my_errors:Array = [];
if ( !Camera.isSupported )
{
my_errors.push( 'camera is not supported' );
}
else
{
camera = Camera.getCamera();
if ( !camera )
{
my_errors.push( 'no camera found' );
}
else if ( camera.muted )
{
Security.showSettings( SecurityPanel.PRIVACY );
}
}
mic = Microphone.getMicrophone();
if ( !mic )
{
my_errors.push( 'no microphone found' );
}
if ( my_errors.length )
{
this.fatal_error( my_errors );
return;
}
camera.setMode( camera_width, camera_height, camera_fps, true );
camera.setQuality( 0, camera_quality );
netconnect = new NetConnection();
netconnect.addEventListener( NetStatusEvent.NET_STATUS, net_status_handler );
netconnect.connect( publish_url );
}
private function net_status_handler( ev:NetStatusEvent ):void
{
switch ( ev.info.code )
{
case 'NetConnection.Connect.Success':
trace( 'CONNECT: Connected to "' + publish_url + '"' );
begin_stream();
break;
}
}
private function begin_stream():void
{
if ( this.recording )
return;
this.recording = true;
guid = GUID.create();
netstream = new NetStream( netconnect );
netstream.addEventListener( NetStatusEvent.NET_STATUS, net_stream_handler );
netstream.attachCamera( camera );
netstream.attachAudio( mic );
netstream.publish( guid, 'record' );
}
答案 0 :(得分:0)
尝试收听StatusEvent.STATUS
对象上的Camera
事件。
当用户点击弹出的闪存安全对话框中的“允许”按钮以询问摄像头/麦克风访问权限时,StatusEvent
将被触发,code
参数等于'{{ 1}}' -
将'Camera.Unmuted
'命令放在该事件上。
e.g。
publish
如果您在用户允许访问相机之前发布 - 它会记录空帧,因为相机还没有视频...... 您也可以在服务器级别对此进行管理(从StatusEvent中调用将开始录制的服务器端功能...)