【问题标题】:Android: how to film a video before extracting its audioAndroid:如何在提取音频之前拍摄视频
【发布时间】:2017-02-20 19:24:56
【问题描述】:

尽管进行了多次搜索,但在单独的活动中将其音频提取为 .wav 之前,我无法开发出能够拍摄视频的 Android 原型。

到目前为止,我已经开发了一个简单的拍摄活动,它依赖于 Android 的相机应用程序。我的策略是在使用 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 初学者。

你有任何可以工作的更正吗?甚至只是一种策略?

提前谢谢你!

【问题讨论】:

    标签: android audio video ffmpeg


    【解决方案1】:

    WritingMinds ffmpeg 实现的工作方式是它提供了一个围绕 FFMPEG 命令行工具的变形器。

    这意味着您可以使用与标准 ffmpeg 命令行相同的语法来操作视频。您使用的命令在上面代码的 cmdExtract 字符串中设置。

    在您的情况下,我认为您只是采用了简单的“-i”示例命令,它只会获取视频的信息。您需要在此处添加正确的 ffmpeg 语法来提取音频。

    您可以轻松搜索所需的 ffmpeg 语法 - 这是包装方法的优势,因为它允许您利用相同的语法和围绕 cmd 行工具的广泛知识。比如这个 Stackoverflow 问题(ffmpeg to extract audio from video)就有一些例子,比如:

    ffmpeg -i input-video.avi -vn -acodec 复制 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();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多