0

同じネットワーク上のサーバーにカメラの出力を送信するプログラムをAndroidフォンで作成しています。これが私のJavaコードです:

camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {

    public void onPreviewFrame(byte[] data, Camera cam) {

        try {
            socket = new Socket("XXX.XXX.XXX.XXX", 3000);
            out = socket.getOutputStream();
            out.write(data);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        camera.addCallbackBuffer(data);
        }

サーバーはNodeJSサーバーです。

time = 0

video_server.on 'connection', (socket) ->
    buffer = []
    socket.on 'data', (data) ->
            buffer.push data
    socket.on 'end', ->
            new_time = (new Date()).getTime()
            fps = Math.round(1000/(new_time - time)*100)/100
            console.log fps
            time = new_time

            stream = fs.createWriteStream 'image.jpg'
            stream.on 'close', ->
                    console.log 'Image saved.', fps
            stream.write data for data in buffer
            stream.end()

私の端末は約1.5fps(5 Mbps)を示しています。私はネットワークプログラミングについてほとんど知りませんが、確かに十分な帯域幅があるはずです。各画像は18fpsで640x480x1.5で、これは約63Mbpsです。ローカルネットワークはこれを簡単に処理できるはずですが、Androidのデバッガーから多くの「接続が拒否されました」というメッセージが表示されます。

私の悪いネットワーク慣行を修正するための助けは素晴らしいでしょう。(画像圧縮については少し説明しますが、今はこの手順を最適化する必要があります)。

4

2 に答える 2

5

あなたは、システムが本来の何倍もの作業をしなければならないようにシステムを設計しました。転送されるフレームごとに接続を確立および切断する必要があります。これはスループットを低下させるだけでなく、リソースを使い果たす可能性もあります。

適切な設計では、フレームを転送するために必要なのは、フレーム データを送受信することだけです。あなたのデザインでは、フレームごとに TCP 接続を構築し (3 つのステップ)、フレーム データを送受信し、TCP 接続を切断する必要があります。さらに悪いことに、受信側は、接続がシャットダウンされるまで、すべてのフレーム データを受信したことを認識できません。したがって、これを背景に隠すことはできません。

まともなプロトコルを設計すれば、問題はなくなります。

于 2012-08-23T02:30:12.907 に答える
1

これはまったく機能していますか?サーバーのポート 3000 にバインドしている場所がわかりません。

いずれにせよ、これがビデオ ストリームである場合は、おそらく TCP ではなく UDP を使用する必要があります。UDP ではパケットがドロップされることがありますが、ビデオ ストリームの場合、これはおそらく気にならないでしょう。UDP 通信は、交換されるメッセージの数が多いため、TCP よりもはるかに少ないオーバーヘッドで済みます。TCP には、データの各部分が確実に宛先に到達するようにするための「ACK」が多数含まれています。UDP は気にしないため、送信するパケットが少なくなります。私の経験では、UDP ベースのコードは一般に TCP ベースのコードよりも複雑ではありません。

_ryan

于 2012-08-22T22:42:02.027 に答える