同じネットワーク上のサーバーにカメラの出力を送信するプログラムを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のデバッガーから多くの「接続が拒否されました」というメッセージが表示されます。
私の悪いネットワーク慣行を修正するための助けは素晴らしいでしょう。(画像圧縮については少し説明しますが、今はこの手順を最適化する必要があります)。