【发布时间】:2014-05-04 16:35:19
【问题描述】:
我正在开发一个应用程序,它可以将相机帧和音频从一部 Android 手机发送到另一部 将 UDP 与 DatagramPacket 类一起使用 我已经设法发送录制的音频并在另一边播放 我还设法通过
捕获相机帧 Camera.PreviewCallback previewCalBac = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (data != null) {
// mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Log.d("CAMERA", "CHANGED" + data.length);
startStreamingVideo(data);
}
}
};
发送操作是这样的
private void startStreamingVideo(byte[] data) {
Log.d(VIDEO_CLIENT_TAG, "Starting the video stream");
if(data!=null){
currentlySendingVideo = true;
startVStreaming(data);}
else{
Log.d(VIDEO_CLIENT_TAG, "NULL DATA");
}
}
private void startVStreaming(final byte[] data) {
Log.d(VIDEO_CLIENT_TAG,
"Starting the background thread to stream the video data");
Thread streamThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.d(VIDEO_CLIENT_TAG, "Creating the datagram socket");
DatagramSocket socket = new DatagramSocket();
Log.d(VIDEO_CLIENT_TAG, "Creating the buffer of size "+ data.length);
byte[] buffer = new byte[4096];
Log.d(VIDEO_CLIENT_TAG, "Connecting to "+ ipAddress.getText().toString() + ":" + VPORT);
final InetAddress serverAddress = InetAddress.getByName(ipAddress.getText().toString());
Log.d(VIDEO_CLIENT_TAG, "Connected to "+ ipAddress.getText().toString() + ":" + VPORT);
Log.d(VIDEO_CLIENT_TAG,"Creating the reuseable DatagramPacket");
DatagramPacket packet;
Log.d(VIDEO_CLIENT_TAG, "Creating the VideoRecord");
// recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,RECORDING_RATE, CHANNEL, FORMAT, data.length);
// Log.d(VIDEO_CLIENT_TAG, "VideoRecord recording...");
// recorder.startRecording();
while (currentlySendingVideo == true) {
// read the data into the buffer
Log.d(VIDEO_CLIENT_TAG, "Here0");
// int read = recorder.read(data, 0, data.length);
Log.d(VIDEO_CLIENT_TAG, "Here");
// place contents of buffer into the packet
packet = new DatagramPacket(data, 4096,serverAddress, VPORT);
Log.d(VIDEO_CLIENT_TAG, "Here1");
// send the packet
socket.send(packet);
Log.d(VIDEO_CLIENT_TAG, "Here2");
}
Log.d(VIDEO_CLIENT_TAG, "VideoRecord finished recording");
} catch (Exception e) {
Log.e(VIDEO_CLIENT_TAG, "HERE Exception: " + e);
}
}
});
// start the thread
streamThread.start();
}
服务器端我可以知道我正在接收数据包 问题是位图图像字节[]太大而无法发送 我需要将它缩放到最佳大小,以便我可以传输它并以最少的浪费字节接收它。 这个问题有什么解决办法吗?
【问题讨论】:
-
您是否已经考虑过压缩要传输的数据,即对视频/音频进行编码。
-
不,我没有尝试过这样的事情。正如我之前所说,你对音频没有问题,它的分离问题是图像的问题,我该如何压缩它?
-
初学者请看setPreviewFormat()。
标签: android bitmap bytearray android-wifi