안녕하세요
이클립스 갈릴레오
안드로이드 2.2

MediaPlayer
를 개발하고있습니다.
로컬에있는 30M정도의 동영상 파일(3gp) fd 로 재생하려고 합니다 ( setdatasource(fd) )
동영상이 크기때문에 우선 동영상을 FileInputstream으로 받아서 byte로 읽은 후
다시 FileOutputstream을 이용하여 다른 여러개의 파일들로 저장합니다. 쪼갠 파일( 3M라 가정)들 각각의 fd를 얻습니다
순서대로 처음엔 setdatasource(fd1)을 넣고 이어서 fd2, fd3, fd4 이렇게 넣으면 이게 재생이 가능할까요?
그리고 차례대로 fd를 업데이트하려면
onresume
은 아니고 sufacechange에서 업데이트를 해줘야 할까요?
sufacechange
surface의 구조적인 변화(format, size)가 있을때 호출된다고 해서 아닌것도 같구..
밑에 이 소스 첨부합니다.


   mMediaPlayer = new MediaPlayer();
   FileInputStream fis;
   fis = new FileInputStream("/mnt/sdcard/day.3gp");
   BufferedInputStream bis = new BufferedInputStream(fis);
 
   byte[] buf = new byte[3145728]; //3MB
   int readCount = -1;
   long size = 0;
   int i = 0;
   while(size < 28611022){ //동영상 약 30M
    fis.skip(size);
    
    if ((readCount = bis.read(buf)) != -1) {
     
     Log.i("MyLog","skip size: "+size+ " readCount: "+readCount);
     
     String filename = "/data/data/com.kpp.video/re"+i+".3gp";
     File myfile = new File(filename);
     boolean success = myfile.createNewFile();
     Log.i("MyLog", "file create success - "+i+" " +success);

     FileOutputStream fos = new FileOutputStream(filename);
     BufferedOutputStream bos = new BufferedOutputStream(fos);
     
     bos.write(buf, 0, readCount);
     size += readCount;
     Log.i("MyLog", "readCount: " +readCount+ "  size: " + size);
     fd = fos.getFD();
          
     //fos.flush();
     //bos.close();
     i++;
    } else {
     
    }
    
   }
   Log.i("MyLog", "file end");
   bis.close();

   mMediaPlayer.setDataSource(fd);


사실 이 전에 동영상 파일의 특정부분을 (1024 바이트 ~ 20480 바이트)
똑같이 FileInputstream으로 받아서 byte로 읽은 후 다시 FileOutputstream을 이용하여 파일(.3gp)로 저장하여
FD로 재생하려고 했습니다. 근데 setdatasource status = 0x8000000 에러가 나더라구요
제 생각엔 잘못된 FD값이고,
새로 만들어진 파일이 스트림통해서 바이트로 저장되는 과정을 거치면서
더이상 동영상의 형태가 아니게 되어버린것 같습니다. 이건 새로 만들어진 일부분의 동영상 파일을 플레이하려고 하면
코덱없다고 재생을 못하기 때문입니다.
이 과정이 잘 안된다면 연속된 fd 값을 받아서 재생하는것도 불가능할것같은데..
도움부탁드립니다.