2013-02-11 2 views
1

이는 내가 사용하는 기능이다 retriever.getFrameAtTime이 정확하지 않습니다. 어떻게 동영상의 스크린 샷을 얻을 수 있습니까?

public Bitmap getVideoFrame(String FD, long time) { 
    MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    try { 
     retriever.setDataSource(FD); 
     return retriever.getFrameAtTime(time * 1000, MediaMetadataRetriever.OPTION_CLOSEST); 
    } catch (IllegalArgumentException ex) { 
     ex.printStackTrace(); 
    } catch (RuntimeException ex) { 
     ex.printStackTrace(); 
    } finally { 
     try { 
      retriever.release(); 
     } catch (RuntimeException ex) { 
     } 
    } 
    return null; 
} 

여기서 FD 비디오 시간 = videoview.getCurrentPosition의 경로()이고;

문제는이 함수가 필요한 정확한 프레임을 얻지 못하는 것입니다. 긴 비디오 (20 분)에서는 짧은 비디오 (10-20 초)보다 정확합니다. 제가 누락 된 부분이 있습니까, 아니라면, 리트리버 대신 무엇을 사용할 수 있습니까?

+0

FYI : Android 6.0 Marshmallow는 정확한 프레임이 'getFrameAtTime' API에 의해 반환되지 않는 버그를 알고 있습니다. - https://code.google.com/p/android/issues/detail?id=193194 –

답변

-1
ImageView imageView1=(ImageView)findViewById(R.id.imageView1); 

Bitmap bm=ThumbnailUtils.createVideoThumbnail(Environment.getExternalStorageDirectory() + "/videocapture.3gp",Thumbnails.MICRO_KIND); 

imageView1.setImageBitmap(bm); 
+0

질문은 주어진 시간에 비디오 프레임을 얻는 방법이었습니다.이 답변은 의미가 없습니다. –

+0

그래, 더 이상한 것은 정답으로 받아 들여집니다. – habibhassani

1

작은 기능의 비디오에는 버그가 있으며 분명히 작은 크기의 비디오에서는 작동하지 않으며 매우 신뢰할 만하지 않습니다. 최근에 SO, see this post에이 질문을했는데 정답이 없으므로 많은 작업을 수행했습니다. 조사하고 FFMPEG 대신에 FFMPEG을 사용했습니다. 휴대 전화에서 프레임을 추출하는 프로세스가 느리며 큰 비디오 즉 50Mb를 초과하는 경우 종종 2 분이 걸리는 것으로 나타났습니다. 밀리 초 단위로 정확하게 비디오 프레임을 추출 할 수있었습니다. 나는 원했다. 시도는 옵션없이 사용하는

+0

FFMPEG를 사용하여 나를 도울 수있는 링크 또는 무언가? –

+0

많은 FFMPEG 라이브러리가 FFMPeg 용으로 제작되었습니다. Google에 Android 용 FFMPeg를 입력하고 원하는 라이브러리를 가져와야합니다. GitHub에서이 라이브러리를 사용했습니다. https://github.com/uday-rayala/video-trimmer –

+0

무료로 사용할 수 있습니까, 아파치 라이센스가 있습니까? 아니면 무료 라이브러리를 사용할 수 있기 때문에 사용료를 지불해야합니까? 나는 FFMPEG에 대한 인터넷을 검색했지만, 많은 사람들이 상용 응용 프로그램에서 무료로 사용할 수 없다고 말했습니다. –

1

...

retriever.getFrameAtTime (시간 * 1000);

동일한 문제가 있었지만 수정 한 후에는 완벽하게 작동했습니다.

0
retriever.getFrameAtTime(second* 1000*1000); 

는 마이크로 필요하지만 밀리 초 없습니다.

+0

어, 뭘? =) – Robert

+0

밀리 세컨드, 잊지 마라, 나는 밀리 초가 필요하다고 생각했다. :) –

+0

테스트 됨. 이것은 받아 들여진 대답이어야합니다. 실제로 인수 이름에서 알 수 있습니다. timeUs는 μs 단위의 시간을 의미합니다. 즉, 마이크로 초입니다. – topduo

관련 문제