How to video record with specific sound programmat

2019-02-10 11:24发布

问题:

I have created functionality to record video in my app.

When I play a song, that song is recorded with video and a video file is created, similar to a dubshmash application.

Now the problem that I am facing is that other voices such as near by sounds also get recorded. The song file is recorded in the video record screen and I play the song when video recording activity launches.

How can I have my application record only song with video?

 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
  mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

Is there any solution in audio source set as a speaker , because song sound going through a speaker? if is it another possible way please reply me.

回答1:

If you want to working with video then you have to use FFMPEG library

That can be you can work with Video.

That for i have already give answer to How to use ffmpeg in android studio? see this LINK. Go step by step and import in your project



回答2:

You can record video without audio and merge audio later on using mp4 parser like this:

/*
 * @param videoFile path to video file
 * @param audioFile path to audiofile
*/
    public String mux(String videoFile, String audioFile) {
        Movie video = null;
        try {
            video = new MovieCreator().build(videoFile);
        } catch (RuntimeException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    Movie audio = null;
    try {
        audio = new MovieCreator().build(audioFile);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    } catch (NullPointerException e) {

        e.printStackTrace();
        return null;
    }
    int size = audio.getTracks().size();
    Track audioTrack = audio.getTracks().get((size - 1));
    video.addTrack(audioTrack);

    Container out = new DefaultMp4Builder().build(video);

    File myDirectory = new File(Environment.getExternalStorageDirectory(), "/Folder Name");
    if (!myDirectory.exists()) {
        myDirectory.mkdirs();
    }
    filePath = myDirectory + "/video" + System.currentTimeMillis() + ".mp4";
    try {
        RandomAccessFile ram = new RandomAccessFile(String.format(filePath), "rw");
        FileChannel fc = ram.getChannel();
        out.writeContainer(fc);
        ram.close();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
return filePath;
}

In build.gradle add following dependency

compile 'com.googlecode.mp4parser:isoparser:1.0.5.4'


回答3:

You can use a MediaRecorder without calling setAudio* on it. remove this line

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

see this link



回答4:

There is currently no way to directly record android output without "background noise".

Note that this is a security concern to restrict access to other apps audio output, therefore it is very unlikely that it could be achieved directly.

See this answer



回答5:

You can also use Javacv (FFmpeg java wrapper) to merge audio video.You will need to do this task in either async or in thread.

FrameGrabber videoGrabber = new FFmpegFrameGrabber(videoPath);
Frame videoFrame=null;
FrameRecorder mFrameRecorder;
            videoGrabber.start();
            mFrameRecorder = new FFmpegFrameRecorder(OutputPath,
                    videoGrabber .getImageWidth(), videoGrabber.getImageHeight(), 2);
            mFrameRecorder.setVideoQuality(1);
            mFrameRecorder.setFormat("mp4");
            mFrameRecorder.setFrameRate(videoGrabber.getFrameRate());
            mFrameRecorder.start();

            while ((videoFrame = videoGrabber.grabFrame())!=null) {
                videoFrame = videoGrabber.grabFrame();
                mFrameRecorder.record(videoFrame);
                }
            mFrameRecorder.stop();
            mFrameRecorder.release();
            videoGrabber.stop();
    } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        }  catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        }

In app level build.gradle

Add these dependencies

compile'org.bytedeco:javacv:1.0'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.11-0.11', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.6.1-0.11', classifier: 'android-arm'