2017-02-18 10 views
0

多くの検索にもかかわらず、そのオーディオを抽出する前にビデオを撮影するためにどのように、私は別の活動の.WAVとしてのオーディオを抽出するフィルム映像にできるAndroidのプロトタイプを開発することができていません。アンドロイドは:

私はこれまで、Androidのカメラアプリケーションに依存する簡単な撮影活動を開発しました。私の戦略は、FFMPEGを使用する前に、ビデオのUriをExtraとして次のアクティビティに入れることでしたが、私はUriとFFMPEGの間で移行することはできません。確かに、私はAndroidスタジオ初心者ですから、どのコンセプトを使うのかまだ分かりません。

ここに私のビデオ録画のコードがあります。

import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.widget.Toast; 
import android.widget.VideoView; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.channels.FileChannel; 

import static java.security.AccessController.getContext; 


public class RecordActivity extends Activity{ 

static final int REQUEST_VIDEO_CAPTURE = 0; 

VideoView mVideoView = null; 
Uri videoUri = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mVideoView = (VideoView) findViewById(R.id.videoVieww); 
    setContentView(R.layout.activity_record); 

    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 

    Toast.makeText(RecordActivity.this,   String.valueOf(Build.VERSION.SDK_INT) , Toast.LENGTH_SHORT).show(); 

    takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri); 
    if (takeVideoIntent.resolveActivity(getPackageManager()) != null) { 
     startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); 
    } 

} 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) { 
      videoUri = intent.getData(); 

      Intent intentForFilterActivity = new Intent(RecordActivity.this, FilterActivity.class); 
      intentForFilterActivity.putExtra("VideoToFilter", videoUri.getPath()); 
      startActivity(intentForFilterActivity); 

     } 
    } 
} 

ここでは、音声抽出アクティビティのコードを示します。追加の機能を使用して屋外のノイズをフィルタリングすることを最終目的としているため、「FilterActivity」と呼ばれています。 WritingMindsのFFMPEG実装を使用しています。 https://github.com/WritingMinds/ffmpeg-android-java

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.test.ActivityUnitTestCase; 
import android.widget.Toast; 

import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler; 
import com.github.hiteshsondhi88.libffmpeg.FFmpeg; 
import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegCommandAlreadyRunningException; 



public class FilterActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_filter); 

    Intent intentVideo = getIntent(); 
    String pathIn = intentVideo.getStringExtra("VideoToFilter"); 

    FFmpeg ffmpeg = FFmpeg.getInstance(FilterActivity.this); 
    try { 
     String[] cmdExtract = {"-i " + pathIn + " extracted.wav"}; 
     ffmpeg.execute(cmdExtract, new ExecuteBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onProgress(String message) {} 

      @Override 
      public void onFailure(String message) { 
       Toast.makeText(FilterActivity.this, "Failure !", Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onSuccess(String message) {} 

      @Override 
      public void onFinish() {} 
     }); 
    } catch (FFmpegCommandAlreadyRunningException e) { 
    } 
} 


} 

と私はいつも "失敗!" 取得しますメッセージ。

コードの一部が極端に悪く見える場合があります。これまでに書いたように、私はAndroid Studioの初心者です。

修正がありますか?それとも単なる戦略ですか?

ありがとうございます!

答えて

0

WritingMinds ffmpegの実装の仕組みは、FFMPEGコマンドラインツールの周りにワーパを提供するということです。

これは、標準のffmpegコマンドラインと同じ構文を使用してビデオを操作できることを意味します。使用するコマンドは、上記のコードのcmdExtract文字列で設定します。

あなたの場合は、私はちょうど '-i'で、ビデオの情報しか得られないコマンド例を取ったと思います。ここでオーディオを抽出するには、正しいffmpeg構文を追加する必要があります。

必要なffmpeg構文を非常に簡単に検索することができます。これは、コマンドラインツールについて同じ構文と幅広い知識を活用できるため、ラッパーアプローチの利点です。たとえば、このStackOverflowの質問(ffmpeg to extract audio from videoは)のようないくつかの例、しています

のffmpeg -i入力-video.avi -vn -acodecあなたはあなたのケースでは、出力-audio.aac

をコピーしますこの上記の構文を使用するために、あなたの入力および出力ファイルパスを代入(cmdExtractを設定します:

String[] cmdExtract = {"-i " + pathIn + " -vn -acodec copy " + pathOut}; 

また、あなたがしても、この時点に到達する前に障害メッセージを取得しているようだ - あなたのコードは、このかもしれないがいかに簡単で与えられましたファイルパスだけにするueなどですが、これを理解するための最初のステップは、図書館があなたに返すメッセージを印刷することです。例えば、これを次のように変更します。

  @Override 
      public void onFailure(String message) { 
       Toast.makeText(FilterActivity.this, "Failure: " + message, Toast.LENGTH_LONG).show(); 
      }