2017-10-23 1 views
1

내가 http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txtExtractMpegFrames.java를 사용하여 mp4에서 프레임을 png 파일로 올바르게 저장하는 방법은 무엇입니까?

내가 현재 할 모든 프레임을 저장하는 디렉토리에 임시 파일 (File.createTempFile)를 생성하고, 생성 여기에있는 ExtractMpegFrames.java 클래스를 사용하여 MP4 파일에서 모든 프레임을 얻기 위해 노력하고 있어요 a FileOutputStream 및 do

bm.compress(Bitmap.CompressFormat.PNG, 100, fOut) 

여기서 fOut는 파일의 OutputStream입니다.

는 현재 저장된 이미지는 다음과 같다 : https://imgur.com/a/XpsV2

카메라 2 API를 사용하여, 나는 비디오를 녹화하고, MP4로 저장합니다. VLC에 따르면 비디오의 색상 공간은 평면 4 : 2 : 0 YUV 전체 스케일입니다.

주위를 둘러 보니 각 공급 업체마다 서로 다른 색 공간을 사용하고있는 것으로 보입니다 https://stackoverflow.com/a/21266510/7351748. ffmpeg는 색상 공간으로 변환 할 수 있지만 사용할 수는 없습니다.

이상한 출력 PNG의 문제를 해결하기 위해 어디서부터 시작해야할지 모르겠습니다. 나는 이것이 색 공간 문제라고 가정하고 있지만 여기서 완전히 틀릴 수있다.

답변

0

동영상의 모든 프레임을 얻을 수 있습니다. 여기 ffmpeg 라이브러리를 사용하면 작동하는 코드입니다.

의존성에게 Gradle을 여기

 private void loadFFMpegBinary() { 
     try { 
      if (ffmpeg == null) { 
       ffmpeg = FFmpeg.getInstance(this); 
      } 
      ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 
//    @Override 
//    public void onFailure() { 
//     showUnsupportedExceptionDialog(); 
//    } 

       @Override 
       public void onSuccess() { 
        Log.d(TAG, "ffmpeg : correct Loaded"); 
       } 
      }); 
     } catch (FFmpegNotSupportedException e) { 

     } catch (Exception e) { 
      Log.d(TAG, "EXception : " + e); 
     } 
    } 

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

를 추가 이미지 extratct 방법에게있는 경우

public void extractImagesVideo() { 
     File moviesDir = Environment.getExternalStoragePublicDirectory(
       Environment.DIRECTORY_PICTURES 
     ); 

     String filePrefix = "extract_picture"; 
     String fileExtn = ".jpg"; 
     String yourRealPath = getPath(Pick_Video.this, DataModel.selectedVideoUri); 
     Log.d("selected url", "" + DataModel.selectedVideoUri); 
     File src = new File(yourRealPath).getAbsoluteFile(); 

     File appDir=new File(moviesDir,"/"+app_name+"/"); 
     if(!appDir.exists()) 
      appDir.mkdir(); 
     DataModel.appDir=appDir; 
     File dir = new File(appDir, "testVideo"); 
     int fileNo = 0; 
     while (dir.exists()) { 
      fileNo++; 
      dir = new File(moviesDir+"/"+app_name+"/", "testVideo" + fileNo); 

     } 
     dir.mkdir(); 
     DataModel.dir = dir; 

     resultList = new ArrayList<String>(256); 

     filePath = dir.getAbsolutePath(); 
     File dest = new File(dir, filePrefix + "%03d" + fileExtn); 


     Log.d(TAG, "startTrim: src: " + src.toString()); 
     Log.d(TAG, "startTrim: dest: " + dest.getAbsolutePath()); 


     String[] complexCommand = { "-i",""+src.toString(),"-qscale:v", "2","-vf", "fps=fps=20/1",dest.getAbsolutePath()}; 
     //"-qscale:v", "2","-vf", "fps=fps=20/1",// 
     //works fine with speed and 
     execFFmpegBinary(complexCommand); 



    } 

호출 버튼 클릭 이벤트에서이 두 가지 방법

댓글입니다질문.

+0

FFmpeg를 사용하지 않고이를 수행 할 수있는 방법이 있습니까? –

+0

나는 ffmpeg없이 이것을하는 방법에 관하여 아무 아이디어도 없다 그러나 저에게 ffmpeg를 사용하는 제일 방법에 따르면 당신은 ffmpeg로 할 수있는 것의이 유형의 심상의 수 및 qulity를 놓을 수있다 –

관련 문제