2

私は、ローカル メディア (Web カメラやマイクなど) にアクセスし、リモート ブラウザー間でオーディオ ビデオを送信するために、Flash とインターフェイスする必要がある HTML5 アプリに取り組んでいます。しかし、このアプリでは、リモート Web カメラ ディスプレイからのさまざまな HTML 要素で区切られた、画面の一部にローカル Web カメラ ディスプレイを配置する必要があります。これは、Flash アプリの複数のインスタンスを実行する必要があることを意味していると確信しています。しかし、一度に取得できる Web カメラのインスタンスは 1 つだけだと思います。つまり、これらの Web カメラとマイク オブジェクトを Flash インスタンス間で共有できるようにする必要があります。リモート ウェブカメラ。それは可能ですか?例えば、

つまり、次のような ActionScript クラスを作成することを考えています (もちろん、かなり単純化されています)。

public class MediaController
{

    public function MediaController()
    {
        ExternalInterface.addCallback('getUserMedia', this.getUserMedia);
        ExternalInterface.addCallback('getCamera', this.getCamera);
        ExternalInterface.addCallback('setCamera', this.setCamera);
        ExternalInterface.addCallback('getMicrophone', this.getMicrophone);
        ExternalInterface.addCallback('setMicrophone', this.setMicrophone);
    }

    private var _mic:Microphone;
    private var _cam:Camera;

    public function getUserMedia()
    {
      _mic = Microphone.getMicrophone();
        _cam = Camera.getCamera();
    }

    public function getCamera():Camera
    {
        return this._cam;
    }

    public function setCamera(cam:Camera):void
    {
        this._cam = cam;
    }

    public function getMicrophone():Microphone
    {
        return this._mic;
    }

    public function setMicrophone(mic:Microphone):void
    {
        this._mic = mic;
    }
}

そして、次のように JavaScript でそれらを取得します。

var localUser = $('#localUser')[0];
localUser.getUserMedia();
var mic = localUser.getMicrophone();
var cam = localUser.getCamera();

次に、リモート ユーザーと実際に通信しているインスタンスに、次のように戻します。

var remoteUser = $('#remoteUser')[0];
remoteUser.setMicrophone(mic);
remoteUser.setCamera(cam);

そのようにすることに関連する既知の落とし穴はありますか? これを処理するより良い方法はありますか?(そして、あなたが尋ねる前に、そうです、そうでなければアドバイスがない場合は、私はこれをコード化する予定です。私が見つけたものをみんなに知らせます - 私が得る前に既知の落とし穴や代替手段があるかどうか知りたいだけです)始めました。:-)

4

2 に答える 2

1

CameraやのようなオブジェクトMicrophoneを 経由で Javascript に渡すことはできませんExternalInterface。を使用ExternalInterfaceして Javascript と通信する場合、渡すデータはすべて XML 形式にマーシャリングされます。その時点で、カメラ/マイクはフラッシュCameraMicrophoneオブジェクトではなくなります。

2 つの別々の SWF から同じカメラに同時にアクセスしようとすると、一部のブラウザー/オペレーティング システムで機能する場合があります。ただし、他の場合は失敗します。カメラにアクセスしていた 2 つのまったく無関係な Web サイトで、この動作が見られました。

LocalConnectionクラスを使用して SWF が相互に通信することは可能ですが、カメラやマイクでこのようなことを試したことはありません。

于 2012-12-27T19:11:57.373 に答える
0

価値があるのは、これが私が(多かれ少なかれ)とったアプローチであり、うまくいくことです。複雑で少しもろいですが、うまくいきます:

// A typical 1:1 communication will involve four instances of the FlashMediaObject class:
// Instance1 (Initiator Sender): Displays local video, streams local video out to Instance4
// Instance2 (Initiator Receiver): Receives and displays video from Instance3
// Instance3 (Responder Sender): Displays local video, streams local video out to Instance2
// Instance4 (Responder Receiver): Receives and displays video from Instance1

// The workflow needs to go something like this:
// (1) Both: Room.onSessionAdded():     
//          SignalR makes both the JS clients for both the Initiator and the Responder aware of each other (i.e., their SessionId's).
// (2) Initiator: writeLocalMediaElement() -> fmo1.Connect():
//          Instance1 connects to Adobe's rtmfp service, gets its nearId, and passes it up to JS.
// (3) Responder: writeLocalMediaElement() -> fmo3.connect():
//          Instance3 connects to Adobe's rtmfp service, gets its peerId, and passes it up to JS.
// (4) Responder: prepareForCall() -> fmo4.connect():           
//          Instance4 connects to Adobe's rtmfp service, gets its peerId, and passes it up to JS.
// (5) Initiator: call() -> prepareForCall() -> fmo2.Connect():
//          Instance2 connects to Adbobe's rtmfp service, gets its nearId, and passes it up to JS.
// (6) Initiator: call() -> server.flashOffer():
//          The Initiator's JS controller contacts the Responder's JS (via SignalR), and passes it the two rtmfp ID's.
// (7) Responder: handleFlashOffer() -> fmo3.call():            
//          The Responder's JS controller passes the peerId for Instance2 (Initiator Receiver) to Instance3 (Responder Sender).
//          Instance3 begins publishing its video to Instance 2.
// (8) Responder: handleFlashOffer() -> fmo4.prepareForCall():
//          The Responder's JS controller passes the peerId for Instance1 (Initiator Sender) to Instance4 (Responder Receiver)
//          Instance4 prepares to receive a call from Instance1.
// (10) Responder: handleFlashOffer() -> server.flashAnswer():  
//          The Responder's JS controller contacts the Initiator's JS (via SignalR), and passes it the two peer ID's.
// (11) Initiator: handleFlashAnswer() -> fmo1.call():
//          The Initiator's JS controller passes the peerId for Instance4 (Responder Receiver) to Instance1 (Initiator Sender).
//          Instance1 connects to Instance4 and begins streaming video.
// (12) Initiator: handleFlashAnswer() -> fmo2.prepareForCall()
//          The Responder's JS controller passes the peerID for Instance3 (Responder Sender) to Instance2
//          Instance2 prepares to receive video from Instance3
// (9) Initiator: fmo2.onCall():
//          Instance2 begins playing video from Instance3.
// (13) Responder: fmo4.onCall():
//          Instance4 begins playing video from Instance1
于 2012-12-31T21:30:25.577 に答える