【问题标题】:Publish/record to FMS4.5 leaves small gap at beginning of video发布/录制到 FMS4.5 在视频开头留下小间隙
【发布时间】:2012-03-26 17:48:08
【问题描述】:

我们正在使用 Adob​​e FMS 4.5 来录制来自用户网络摄像头的视频。我们不会直播这个视频,我们只是想捕捉它并将其保存在服务器上以便以后处理它(附加到用户的帐户,显示为页内内容等)。

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

问题是那些录制的视频一开始似乎有一个小的差距。它明显少于一秒。我们说的可能是没有视频数据的 5/100 秒到 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' );
}

【问题讨论】:

    标签: flash video video-streaming flash-media-server netstream


    【解决方案1】:

    尝试在Camera 对象上监听StatusEvent.STATUS 事件。 当用户单击弹出的闪存安全对话框上的“允许”按钮以询问相机/麦克风访问权限时 - StatusEvent 将被触发,code 参数等于“Camera.Unmuted” - 将“publish”命令放在该事件上。

    例如

    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);
    

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

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多