尽管进行了大量搜索,但我还是无法在在单独的活动中将其音频提取为.wav 之前开发能够拍摄视频的Android原型。< / p>
到目前为止,我已经开发了一个简单的拍摄活动,它依赖于Android的Camera应用程序。我的策略是在使用FFMPEG之前将视频的Uri作为Extra进行下一次活动,但我不能在Uri和FFMPEG之间进行转换。事实上,我是一个新的Android Studio初学者,所以我仍然不确定使用什么概念。
这是我的视频录制活动代码。
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 :(得分:0)
WritingMinds ffmpeg实现的工作方式是它为FFMPEG命令行工具提供了一个warper。
这意味着您可以使用与标准ffmpeg命令行相同的语法来操作视频。您使用的命令在上面代码中的cmdExtract字符串中设置。
在你的情况下,我认为只是采用了简单的&#39; -i&#39;并且只会获取视频信息。您需要添加正确的ffmpeg语法以在此处提取音频。
您可以非常轻松地搜索所需的ffmpeg语法 - 这是包装器方法的优势,因为它允许您在cmd行工具周围使用相同的语法和广泛的知识。例如,此Stackoverflow问题(ffmpeg to extract audio from video)有一些示例,例如:
ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac
在您使用上述语法的情况下,您可以设置cmdExtract(替换您的输入和输出文件路径:
String[] cmdExtract = {"-i " + pathIn + " -vn -acodec copy " + pathOut};
在您达到这一点之前,您似乎也收到了失败消息 - 鉴于您的代码有多简单,这可能只是文件路径问题,但帮助您解决这个问题的第一步是打印库返回上面隐藏的消息 - 例如,将其更改为:
@Override
public void onFailure(String message) {
Toast.makeText(FilterActivity.this, "Failure: " + message, Toast.LENGTH_LONG).show();
}