public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] _data, Camera _camera) {
bitbyte=_data;
Log.i("Preview Class", _data.length+"");
try {
CameraPreview.UdpClient.sendmessage(_data);
} catch (IOException e) {
}
}
});
}
-------------------------------------------------------------------------------------------------------------------------------
public void sendmessage(byte[] buf) throws IOException {
InetAddress addr = InetAddress.getByName(destAddr); //destAddr는 아이피 String 객체입니다
DatagramPacket packet = new DatagramPacket(buf, buf.length,addr,destPort);
socket.send(packet);
}
-----------------------------------------------------------------------------------------------------------------------------------
이때 buf 바이트 배열에 정상적으로 값이 들어오는것은 확인했습니다.
그리고 UDP 소켓통신으로 값을 날렸는데 날라가지 않습니다. 그래서
Log.i("test",""+buf.lenght); 로 배열의 크기를 출렸했더니 576000이 나오더군요.
아무래도 배열의 크기가 너무 커서 한꺼번에 안 날라가는것 같은데.
이 문제를 어떻게 해결해야 할까요.
제가 생각한 해결법은 배열의 크기를 잘라서 각각 날린후 받는쪽에서
다시 합친후 화면을 구성한는 방법을 생각했었는데
이 방법 외에 다른 방법이 있는지..
혹은 이 방법을 쓴다면 어떤식으로 구현을 해야할지..
벌써 2~3주째 이부분에서 막혀서 너무 막막합니다.
카메라영상이 스트리밍 가능한 영상인지, 전체데이터가 빈드시 필요한 영상인지 잘모겠지만, 유실가능성을 고려한다면, UDP 데이터가 없어져도 리커버리 가능한 사이즈로 보내면 될듯합니다.
저도 비슷하게 카메라 스트리밍을 구현하는 중인데, 저는 RTP를 사용하기 위해 packetize 하였습니다.
오픈소스로 된걸 좀 뜯어봤었는데, 대부분은 성능 극대화를 위해 JNI를 써서 packetize한 소스를 사용하더군요
저도 정확히는 모르지만 말씀하신 방법으로는 아마 힘들 듯 합니다. 무슨 어플인지 정확히는 모르겠지만, 실시간으로 카메라 인풋을 데이터 전송하는 것이라면 RTP 를 사용하는게 좋을 듯 합니다.
데이터가 yuv로 나오네용? 디코더 된 480 * 600 * 2 = 576000 이게 맞는가요? 이거 rtp로 받으면 사이즈가 2k도 안나오는데요. 디코딩된 데이터라서 크네요.. YUV를 RGB로 변환을 하면 사이즈가 줄어드나요..?안줄어 들겠죠? 아니면 YUV를 RTP Payload로 인코딩을 해서 보내면 사이즈가 300배나 줄겠죠? ㅎ 받은 쪽에선 다시 디코딩하고용 ffmpeg으로~ 암튼 RTP를 사용하는 것을 추천합니다. 실시간이면요~ 그런데.. 모바일 카메라에서 RTP패킷이 나오나요? 저도 궁금하네요~
시간이 상당히 걸렸지만 카메라 영상 전송되게 만들었네요
맨처음 tcp로 YUV데이터를 통째로 날렸었는데 이건 프레임이 3프레임도 안나오게 되고
udp로 날릴시 데이터 속도는 빠르지만 화면이 깨지는 현상이 생겼었고
결국 jpg압축으로 해서 날리니 프레임도 괜찮게 나오고 성공했습니다
카메라 프리뷰 영상 보내는거 질문글 보고 답글드립니다.
지금 저도 영상보내는거 하고 있는데..
jpg로 압축하고 난뒤, 서버로 전송하는 부분을 모르겠습니다 ㅠㅠ
서버는 다윈스트리밍서버 5.5 버전이고, 안드로이드 카메라 프리뷰 영상을 서버로 보내서
vlc 플레이어로 영상을 확인하려고 하는데..
좀 도와주세요 ㅠㅠ.. ㅂ서버로 보내는 부분 코드좀 보여주시거나,, 힌트좀 얻을 수 있을까요?
그리고 프리뷰영상 을 보내는데, jpg를 mp4나 영상 확장자로 변환해서 스트리밍하신건가요?
도통 제가 감을 못잡고 있네요ㅠㅠ제발 부탁드립니다.




UDP는 데이터가 제대로 전달 되는걸 보장하지 않아요. TCP 프로토콜을 사용해야 데이터 전송이 보장됩니다.