2012-03-26 2 views
1

Wir verwenden Adobe FMS 4.5, um Videos von Benutzer Webcam aufzunehmen. Wir übertragen dieses Video nicht live, sondern möchten es einfach erfassen und auf dem Server speichern, um später damit zu arbeiten (an den Benutzeraccount anhängen, als In-Page-Inhalt anzeigen usw.).Publish/record to FMS4.5 lässt kleine Lücke am Anfang des Videos

Wir haben eine robuste Capture-Anwendung geschrieben, die auf den Server-Streams auf, unpublishes richtig, und ermöglicht dem Benutzer das Video zu sehen, nachdem er Aufheben der Veröffentlichung fertig ist, usw. Das zu funktionieren scheint, dass es spart Videodateien als wir erwarten.

Das Problem ist, dass diese aufgenommenen Videos am Anfang eine kleine Lücke zu haben scheinen. Es ist deutlich weniger als eine Sekunde. Wir sprechen vielleicht 5/100s bis 1/10 Sekunde, die keine Videodaten haben. Es sieht wirklich so aus, als gäbe es zu Beginn des Videos keinen Video-Keyframe.

Nun, das wäre normalerweise kein Problem - das Video beginnt nur ein bisschen in der Wiedergabe und spielt gut in den meisten Spielern. Das Problem ist, wir erlauben den Benutzern, Videos später mit einem anderen Werkzeug zu schneiden - einer benutzerdefinierten visuellen Schnittstelle zu FFmpeg. Wenn sie vor dem ersten Keyframe eine Videotrimmung beginnen, entsteht in der endgültigen Ausgabe ein hässliches, graues Durcheinander, da in dem Bereich, in dem FFmpeg mit dem Schneiden begonnen hat, keine visuellen Daten vorhanden sind.

Mein erster Gedanke war: "Oh, ich muss die Kamera (anders | an einem anderen Punkt | auf einigen Rückruf | Etc) befestigen müssen". Ich spielte herum mit dem Anbringen der Kamera vor dem Aufruf veröffentlichen, nach NetStream.Publish.Start, etc., usw.

Fehle ich etwas intrinsisch, hier? Oder arbeite ich gerade mit der falschen Idee, oder verkenne ich den Prozess falsch?

Natürlich, die Antwort, die ich völlig erwarte, aber nicht will, ist: "So macht FMS es." :) Wir könnten einen serverseitigen Prozess hinzufügen, um das erste XX-Bit des Videos zu entfernen, aber es ist willkürlich; Wir wissen nicht, wie viel zu kürzen ist, und wir wollen nicht riskieren, Benutzerdaten zu verlieren.

Hier ist eine Verallgemeinerung der Code, den wir verwendet:

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

Antwort

0

zum StatusEvent.STATUS Ereignis hören Versuchen Sie, auf dem Camera Objekt. Wenn der Benutzer auf die Schaltfläche "Zulassen" im Flash-Sicherheitsdialogfeld klickt, um die Erlaubnis für den Kamera-/Mikrofonzugriff abzufragen, wird StatusEvent ausgelöst, wobei der code-Parameter gleich ist. Setzen Sie die "publish" Befehl für dieses Ereignis.

z.B.

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

Wenn Sie vor dem Benutzer veröffentlichen hat Zugang für die Kamera erlaubt - es wird leer Bilder aufzeichnen, da es noch kein Video von der Kamera ist ... Sie können auch diese verwalten auf der Serverebene natürlich (Rufen Sie innerhalb des StatusEvent eine serverseitige Funktion auf, die die Aufzeichnung startet ...)

Verwandte Themen