2017-10-23 23 views
1

私はhttp://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txtExtractMpegFrames.javaを使用して、mp4のフレームをpngファイルとして正しく保存する方法は?

私は現在、DOはすべてのフレームを保存するディレクトリに一時ファイル(File.createTempFile)を作成され、作成ここで見つけるExtractMpegFrames.javaクラスを使用してmp4ファイルからすべてのフレームを取得しようとしています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ライブラリを使用して作業コードです。

ここ

 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); 
     } 
    } 

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); 



    } 

コールボタンのクリックイベントに、この2つの方式

コメントがあれば画像extratct方法であなたのGradleに依存

compile 'com.writingminds:FFmpegAndroid:0.3.2' 

を追加クエリ。

+0

FFmpegを使用せずに行う方法はありますか? –

+0

私はffmpegなしでこれを行う方法については考えていませんが、私によるとffmpegを使う最良の方法は、フレーム数と画像のqulityを設定することができます。ffmpegでできるこのタイプのもの –

関連する問題