如何在安卓系统中通过编程实现特定声音的视频录制?

6

我已经在我的应用程序中创建了录制视频的功能。

当我播放歌曲时,该歌曲会与视频一起录制,并创建一个视频文件,类似于Dubsmash应用程序。

现在我面临的问题是其他声音(例如附近的声音)也会被录制。歌曲文件记录在视频记录屏幕上,当视频录制活动启动时,我播放歌曲。

我该如何让我的应用程序仅录制带有视频的歌曲?

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

如果音频源设置为扬声器,因为歌曲声音通过扬声器传递,是否有任何解决方案?如果有其他可能的方法,请回复我。


你需要将音频叠加到视频上。不要使用外部麦克风。 - OneCricketeer
@cricket_007 怎么叠加? - Mayank Sugandhi
不知道怎么做,但这就是消除“背景噪音”的方法。 - OneCricketeer
1
@MayankSugandhi 请尝试使用以下代码来停止视频录制时的音频录制:YOUR_AUDIO_RECORDER_OBJECT.setAudioSource(0); - Ravindra Kushwaha
使用噪声消除技术进行适当的音频捕获和降噪。 - Harsh Dev Chandel
1
@MayankSugandhi,你是如何实现在后台录制带有音频回放的视频的?能否提供一个示例? - Bhagat
4个回答

8
您可以使用像这样的mp4解析器在没有音频的情况下记录视频,并稍后合并音频:
/*
 * @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;
}

在build.gradle中添加以下依赖项

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

穆罕默德:-如果我合并音频和视频文件,那么问题就来了,我想剪辑10秒的音频轨道。因为我的过程是在视频录制屏幕上播放整个长度的音乐,并且当我点击按钮时,视频和音频也会记录下来。 - Mayank Sugandhi
Muhammad:有两个阶段。如果我都录制,那么环境噪音会成为问题。而如果我合并这两个文件,那么在视频录制时必须在音频歌曲内部录制两秒钟的无声期间进行录制。那么问题就出现了,如何在Android内部录制或剪切10秒钟的音频? - Mayank Sugandhi
当我尝试你的解决方案时,视频的默认音频和新录制的音频重叠了。你能帮我解决一下吗? - karthik vishnu kumar
你需要从原始电影中仅提取视频,然后加入新音频。你可以使用FFmpeg Java包装器“Javacv”来完成这项任务。请查看我的新答案。 - Muhammad Umair Shafique
如果一个视频有两个文件,例如视频和音频,而我想在上面叠加/混合另一个音频,那么我们如何使用mp4parser来实现? - Ahmad Arslan
显示剩余2条评论

3

如果你想处理视频,那么你必须使用FFMPEG库。

这样你就可以处理视频了。

对于如何在Android Studio中使用FFMPEG,我已经给出了答案。请查看LINK,按步骤导入到你的项目中。


2

您可以在不调用setAudio*的情况下使用MediaRecorder。删除此行

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

请查看 此链接


有没有其他的方法可以合并没有声音的视频、录制音频文件,最后再将音频和视频文件合并。我想制作一个只播放10秒钟的文件,就像Dubsmash一样。你见过Dubsmash的功能吗? - Mayank Sugandhi

1

目前没有直接记录安卓输出而不带“背景噪音”的方法。

请注意,限制访问其他应用程序的音频输出是安全问题,因此直接实现这一点的可能性非常小。

参见此答案


有没有其他的方法可以合并没有声音的视频,录制音频文件,最后再合并音频和视频文件。我想制作一个只播放10秒钟的文件,就像Dubshmash一样。你见过Dubshmash的功能吗? - Mayank Sugandhi
@MayankSugandhi 当然,这与MediaRecorder无关。看一下 - archived
我会尝试...但是音频录制怎么办?能否在内部录制一首歌曲直到10秒钟,没有其他声音记录,并将文件保存在我们的SD卡中。 - Mayank Sugandhi
好的,我查了一下Dubsmash。他们所做的是将预先录制的音频轨与您的视频捕获混合。因此,如果您有要混合的音频和视频,请使用MediaMuxer,就像我在链接中提供的答案中建议的那样。 - archived
您可以在没有声音的情况下录制视频,并在以后合并音频而不向用户显示音频是在后期合并的。 - Muhammad Umair Shafique
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接