Публикация / запись в FMS4.5 оставляет небольшой пробел в начале видео - PullRequest
1 голос
/ 26 марта 2012

Мы используем Adobe 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' );
}

1 Ответ

0 голосов
/ 16 мая 2012

Попробуйте прослушать событие StatusEvent.STATUS на объекте Camera.Когда пользователь нажимает кнопку «Разрешить» в всплывающем диалоговом окне безопасности флэш-памяти, чтобы запросить разрешение на доступ к камере / микрофону, сработает 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, которая начнет запись ...)

...