2011-03-15 5 views
1

루프에서 비디오 파일을 재생하는 응용 프로그램에서 작업하고 있습니다. 지금까지 장치를 마운트하고 비디오 파일을 SD 카드에 복사 한 다음 파일 경로를 사용하여 VideoView에서 시작했습니다. 나는 내가 비디오를 온라인으로 저장하도록 이동 한 비디오를 원격으로 업데이트 할 수있는 방법을 구현하려고 노력 중이다. 응용 프로그램 내에서 로컬 복사본을 확인하고 존재하지 않거나 새로운 것이 있으면 다운로드합니다. 두 가지 다른 비디오 파일 인 .mp4s에서 테스트했습니다. 하나를 다운로드 한 후 처음으로 재생되지만 루프를 다시 시작하려고하면 비디오를 재생할 수 없다고 알려줍니다. 다른 하나는 처음 플레이도하지 않을 것입니다. 단지 비디오를 재생할 수 없다는 대화 상자를 보여줍니다. 이 두 파일은 USB 케이블을 통해 SD 카드에 복사하면 내 응용 프로그램에서 제대로 작동합니다. 앱을 종료하고 다른 항목 (드롭 박스)을 사용하여 수동으로 다운로드하지만 내 앱에서 다운로드 한 경우에는 작동하지 않습니다.안드로이드 mp4 비디오가 온라인에서 다운로드 될 때 손상되었습니다.

public static void DownloadFromUrl(String fileName) { //this is the downloader method 
    try { 
     URL url = new URL("http://dl.dropbox.com/u/myfile.mp4"); 
     File file = new File(PATH + fileName); 
     long startTime = System.currentTimeMillis(); 
     Log.d(myTag, "download begining"); 
     Log.d(myTag, "download url:" + url); 
     Log.d(myTag, "downloaded file name:" + fileName); 


     /* Open a connection to that URL. */ 
     URLConnection ucon = url.openConnection(); 
     Log.i(myTag, "Opened Connection"); 

     /* 
     * Define InputStreams to read from the URLConnection. 
     */ 
     InputStream is = ucon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 
     Log.i(myTag, "Got InputStream and BufferedInputStream"); 
     FileOutputStream fos = new FileOutputStream(file); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     Log.i(myTag, "Got FileOutputStream and BufferedOutputStream"); 
     /* 
     * Read bytes to the Buffer until there is nothing more to read(-1). 
     */ 

     int current = 0; 
     Log.i(myTag, "About to write"); 
     while ((current = bis.read()) != -1) { 
      bos.write(current); 
     } 



     fos.close(); 
     Log.d(myTag, "download ready in" 
       + ((System.currentTimeMillis() - startTime)) 
       + " sec"); 
    } catch (IOException e) { 
     Log.d(myTag, "Error: " + e); 
    } 
} 

나는이 조각의 보관 용 URL을 알고 내가 URL이 올바르게 파일을 가리키는 내 응용 프로그램에서, 단지이 게시물에 대한 그것을 변경되지 올바른지 : 저는 여기에 파일을 다운로드하기 위해 사용하고있는 코드입니다. 그리고 파일을 만들 때 사용 된 변수 PATH는이 스 니펫 외부의 코드에서 설정됩니다.

내 mp4 파일이 손상 될 수있는이 코드 스 니펫에 대해 뭔가가 있습니까?

+1

방법을 사용하여 비디오를 SD 카드로 다운로드 한 다음 USB 케이블을 사용하여 SD 카드에서 파일을 꺼내보십시오. 해당 파일이 재생되는지 확인하십시오. –

+0

내 컴퓨터에서 .mp4를 재생할 플레이어가 없습니다. 필자는 파일 속성을 살펴 봤지만 내 방법이 다운로드하는 파일은 몇 바이트 더 작아야한다고 생각합니다. – FoamyGuy

답변

1

그 방법은 파일을 어떻게 든 손상 시켰습니다. 아직 확실하지는 않지만 일부를 변경했고 이제는 수정되었습니다. 내가 지금 사용하고

: 대신 루프 동안 이전의

 byte data[] = new byte[1024]; 
     long total = 0; 
     int count; 
     while ((count = bis.read(data)) != -1) { 
      total += count; 
      fos.write(data, 0, count); 
     } 

     fos.flush(); 
     fos.close(); 

과 올바르게 작동합니다.

+0

거의 제안했지만 테스트 할 시간이 없었습니다. 스트림은 파일에 의해 백업되므로 스트림을 비우지 않고 메서드에서 반환하면 일부 바이트가 백업 저장소에 저장하지 않고도 개체 스트림에 남아있을 수 있습니다. 'flush() '를 호출하면 바이트가 메모리 객체에서 제거되어 파일에 저장됩니다. –

+0

.flush() 호출이 잠시 동안 문제가 아니었다 고 생각하기에 혼란 스러웠습니다. 실수로 실제로 쓰기 작업을 수행하는 BufferedOutputStream 대신 FileOutputStream에서 flush()를 호출했습니다. 그래서 아무 것도 고치지 않았습니다. 이 문제를 파악할 때 BufferedOutputStream이 필요 없다는 것을 깨달았습니다. – FoamyGuy

+1

버퍼링 된 입출력 스트림은 비 버퍼링 스트림보다 성능이 향상되었습니다. 귀하의 신청서가 번거롭지 않다면 다시 제출해야합니다. –

관련 문제