2017-02-18 2 views
0

Несмотря на многочисленные поиски, я не был в состоянии разработать Android прототип, способный к фильму видео перед тем извлекая его звук, как .wav в отдельном виде деятельности.Android: как снимать видео до извлечения его аудио

Я разработал до сих пор простую съемную деятельность, основанную на приложении камеры Android. Моя стратегия заключалась в том, чтобы добавить Uri в качестве Extra к следующему действию, прежде чем использовать FFMPEG, но я не могу сделать переход между 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) { 
    } 
} 


} 

и я всегда получаю "Failure!" сообщение.

Некоторые части кода могут выглядеть очень плохо. Как написано ранее, я настоящий новичок в Android Studio.

Есть ли у вас исправления, которые могут сработать? Или даже просто стратегия?

Спасибо заранее!

ответ

0

Способ, которым работает реализация ffmpeg WritingMinds, заключается в том, что он обеспечивает перекос инструмента командной строки FFMPEG.

Это означает, что вы можете использовать тот же синтаксис, что и стандартная командная строка ffmpeg, для управления видео. Используемая вами команда устанавливается в строке cmdExtract в вашем коде выше.

В вашем случае у вас есть, я думаю, просто приведен пример команды, которая просто «-i» и которая будет получать информацию только для видео. Вам нужно добавить правильный синтаксис ffmpeg, чтобы извлечь аудио здесь.

Вы можете легко найти синтаксис ffmpeg, который вам нужен - это преимущество подхода обертки, поскольку оно позволяет использовать тот же синтаксис и широкие знания вокруг инструмента линии cmd. Например, этот 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, но первым шагом, чтобы помочь вам понять, было бы напечатать сообщение о том, что библиотека возвращает вас, который скрыт выше, например, изменить его на это: