안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요~!
이클립스 갈릴레오
안드로이드 SDK 2.2
MediaPlayer를 개발하고 있습니다
메인(receiver)과 스레드(sender)가 로컬소켓으로 연결되어있습니다.
메인에서 MediaPlayer를 생성하고 재생을 해줍니다.
이때 스레드 하나가 도는데 이 스레드에서는
짧은 동영상 파일을 적당크기의 버퍼로 read 합니다.
모두 read를 한 다음에 sender 로컬 소켓으로 write를 해줍니다
메인에서는 MediaPlayer 객체생성하고 receiver 소켓으로 얻은 파일디스크립터(fd) 를
setDataSource(fd, offset, count)의 인자로 넣어줍니다.
그런데 계속해서 setDataSourceFd failed status = 0x80000000 exception이 납니다.
offset도 0으로 지정해줬는데 offset error 도 나고 unable to create media player 라고 ..ㅠ ㅠ.
이게 메인이구요
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.SurfaceView01);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
try {
InetAddress tmp = InetAddress.getLocalHost();
Log.i("MyLog", "tmp : " + tmp);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
v_Writer = new VideoWriter();
LocalServerSocket server = new LocalServerSocket(S_ADDR);
MediaWriter mMedia = v_Writer.new MediaWriter();
new Thread(mMedia).start();
Log.i("MyLog", "Media Thread Start");
while (receiver == null) {
receiver = server.accept();
Log.i("MyLog", "Server accept!");
}
} catch (Exception e) {
Log.e("exception", "Player exception: " + e);
}
}
private void playVideo() {
doCleanUp();
try {
mMediaPlayer = new MediaPlayer();
Log.i("MyLog", "Create MediaPlayer");
fd = receiver.getFileDescriptor();
Log.i("MyLog", "playVideo fd: " + fd);
mMediaPlayer.setDataSource(fd);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.i("MyLog", "Start!");
} catch (Exception e) {
Log.e(TAG, "error: " + e.getMessage(), e);
}
}이게 스레드입니다
public class MediaWriter implements Runnable {
public LocalSocket sender = null;
public void run() {
try {
Log.i("MyLog", "MediaWriter Runnable");
sender = new LocalSocket();
sender.connect(new LocalSocketAddress(S_ADDR));
FileInputStream media = new FileInputStream(
"/data/data/com.kpp/ski.3gp");
int readed;
byte[] b = new byte[70000]; // 69986
readed = media.read(b);
Log.i("MyLog","readed: "+readed);
if (readed > 0) {
sender.getOutputStream().write(b, 0, readed);
Log.i("MyLog2", "write~");
}
} catch (Exception e) {
Log.e("myException", "MediaWriter exception", e);
}
}
} 이건 로그입니다




이유가 가물가물한데... 쓸수있는 파일디스크립터를 구분하는데 거기서 걸러져서 저런오류가 나는걸로 알고 있습니다.