Flash 发布/录制到FMS4.5在视频开始时留下小间隙

Flash 发布/录制到FMS4.5在视频开始时留下小间隙,flash,video,video-streaming,flash-media-server,netstream,Flash,Video,Video Streaming,Flash Media Server,Netstream,我们正在使用Adobe FMS 4.5从用户网络摄像头录制视频。我们不是在直播这段视频,我们只是想将其捕获并保存在服务器上,以便以后处理(附加到用户帐户,显示为页面内容等) 我们已经编写了一个健壮的捕获应用程序,它可以流式传输到服务器,正确地取消发布,并允许用户在完成取消发布后查看视频,等等。这似乎确实有效,因为它可以像我们预期的那样保存视频文件 问题是,这些录制的视频在开始时似乎有一个小间隙。不到一秒钟。我们说的可能是5/100到1/10秒,没有视频数据。看起来在视频的最开始没有视频关键帧 现

我们正在使用Adobe FMS 4.5从用户网络摄像头录制视频。我们不是在直播这段视频,我们只是想将其捕获并保存在服务器上,以便以后处理(附加到用户帐户,显示为页面内容等)

我们已经编写了一个健壮的捕获应用程序,它可以流式传输到服务器,正确地取消发布,并允许用户在完成取消发布后查看视频,等等。这似乎确实有效,因为它可以像我们预期的那样保存视频文件

问题是,这些录制的视频在开始时似乎有一个小间隙。不到一秒钟。我们说的可能是5/100到1/10秒,没有视频数据。看起来在视频的最开始没有视频关键帧

现在,这通常不会成为一个问题-视频只是开始播放一点,在大多数播放器中播放良好。问题是,我们允许用户在以后使用另一种工具(FFmpeg的自定义视频界面)任意剪裁视频。如果他们在第一个关键帧之前开始视频修剪,最终输出中会出现难看的灰色混乱,因为FFmpeg开始剪切的区域中没有视觉数据

我的第一个想法是,“哦,我必须连接摄像头(不同的|在不同的点|在某个回调上|等等)”。在调用publish之前、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' );
}

尝试收听
Camera
对象上的
StatusEvent.STATUS
事件。 当用户单击弹出的闪存安全对话框上的“允许”按钮以请求摄像头/麦克风访问权限时,
StatusEvent
将被触发,
code
参数等于“
camera.Unmuted
”- 对该事件执行“
publish
”命令

e、 g

如果您在用户允许访问相机之前发布-它将录制空帧,因为相机中还没有视频。。。 当然,您也可以在服务器级别进行管理(从StatusEvent中调用服务器端函数以启动录制…)

function camStatus (evt:StatusEvent) {
   if (evt.code == 'Camera.Unmuted') {
      // Check if this is the first 'unmute' (as users can also unmute/mute later),
      // if so - publish on the netstream
   }
}
var camera:Camera = Camera.getCamera();
camera.addEventListener(StatusEvent.STATUS,camStatus);