Grabación de cámara web con servidor de medios flash

Estoy tratando de crear una aplicación web que permita al usuario grabar un mensaje de video. Estoy tratando de obtener la mejor calidad posible (incluso si eso significa tiempos de carga prolongados). Logro que la grabación funcione con ns.publish("livestream", "live"); El código del servidor se ve así:

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

El problema es que la calidad no es muy buena. Traté de usar ns.publish("livestream", "record"); , pero está creando 2 archivos en el servidor y la calidad no mejora, ¿alguna sugerencia? También puedo subir el código de cliente si lo necesitas.

Codigo del cliente:

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

preguntado el 04 de julio de 12 a las 08:07

Sí, mostrar el código de cliente. El cliente puede configurar la resolución de captura de la webcam con Cámara.setMode() y establezca alguna preferencia por la calidad de la imagen o el consumo de ancho de banda con Camera.setQuality () -

cámara = Cámara.getCamera(); cam.setMode (800, 480, 24); //cam.setQuality(0, 90); vid = nuevo Video(cam.ancho,cam.altura); vid.adjuntar cámara (cámara); if (Microphone.isSupported) { mic = Microphone.getEnhancedMicrophone(); } -

Los videos (y las resoluciones que admiten las cámaras web) suelen tener una proporción de 4:3. Es probable que la cámara web no admita 800x480, por lo que Flash intenta encontrar algo parecido. El resultado puede no ser tan bueno. Intente usar diferentes valores: 800x600, 640x480, 480x360 o algunos otros valores con una proporción de 4:3. Si el resultado final debe tener otro tamaño, puede escalar o recortar el video (con algo de esfuerzo). Obtengo excelentes resultados a 480x360. -

1 Respuestas

Use una resolución común y evite los valores predeterminados de setQuality

Debe comenzar haciendo lo siguiente a los cambios:

  1. Use una resolución común como 640x480 y una velocidad de fotogramas de 30
  2. Evitar el incumplimiento cam.setQuality configuración y uso cam.setQuality(0,90)

lo anterior se traduce en el siguiente código AS3 del cliente:

cam.setMode (640, 480, 24);
cam.setQuality(0, 90);

cam.setMode(640,480,24);

Lo que sucede es que actualmente estás solicitando 800x480@24fps desde la cámara web. 800x480 a 24 fps no es una resolución ampliamente compatible, lo que significa que en la mayoría de las cámaras web obtendrá cualquier respuesta de la cámara web (que podría no ser la mejor calidad). Solicitando un común una resolución como 640 x 480 a 30 fps garantizará que obtenga exactamente eso en la mayoría de las cámaras web.

cam.setQuality(0, 90);

Tus cam.setQuality se comenta, lo que significa que utilizará los valores predeterminados, lo que se traduce en: variar la calidad de la imagen para mantener la tasa de bits por debajo de 130 kbits/s (o 16384 bytes/segundo).

130kbits/s es MUY BAJO. Utilizar cam.setQuality(0, 90) para decirle a Flash que use tanto ancho de banda como sea necesario para mantener la calidad de la imagen en 90.

Ver Camera.SetQuality documentación para más información.

Versión Red5

Si está usando Red5, debe asegurarse de estar usando al menos Rojo5 1.0.3. Es la 1ra versión con grabación de video arreglada. Todas las versiones anteriores tenían la grabación de video rota, ver esta pregunta para más detalles.

Soluciones comerciales

También debe considerar el uso de una solución comercial como HDFVR or Tuberias que manejan todo, incluido el móvil y la conversión a .mp4.

Con respecto a su observación de "2 archivos"

pero está creando 2 archivos en el servidor y la calidad no mejora

Según el servidor de medios que esté utilizando, puede obtener 1, 2 o más archivos.

Red5 por ejemplo, creará otros 2 archivos durante el proceso de grabación (.ser y .info):

enter image description here

y, después de la primera reproducción, creará otro archivo .meta que contiene la lista de fotogramas clave, su posición de byte y marca de tiempo:

enter image description here

Aquí está el contenido de dicho archivo .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>

respondido 01 nov., 15:13

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.