在安卓系统中,如何暂停录音?

8

我的目标是在录制文件时暂停。我在Android开发者网站上看到了相关内容,但Media Recorder并没有暂停选项。

Java支持编程合并两个音频文件,但在Android中不起作用。

如何在Java中合并两个WAV文件?

我还使用了默认的设备音频记录器应用程序,该应用程序在所有设备上都可用,但在三星的一些设备上未返回记录路径。

Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
startActivityForResult(intent,REQUESTCODE_RECORDING);

有没有人能帮忙实现带暂停功能的语音录制。

4个回答

10

我想要在录音时有暂停选项。Java支持这个功能,那么我该如何在Android中实现呢? - patel
1
你不能暂停和恢复,需要停止和开始。所以在停止时保存音频文件,在开始时重新开始录制。合并两个文件,请参考https://dev59.com/K1fUa4cB1Zd3GeqPKKyJ。 - Raghunandan
我尝试合并两个mp3文件,但没有成功,您能否给我发送一个合并两个mp3文件的示例链接? - patel
https://dev59.com/M2w15IYBdhLWcg3wQpfS - Raghunandan

6

在我的一个项目中,我有这样的需求。我们所做的就是使用AudioRecord创建一个原始文件以保存录制的数据,并在每次恢复时将数据追加到同一文件中。

例如:

FileOutputStream fos= new FileOutputStream(filename, true); 

在这里,文件名是原始文件的名称,并将新的录音数据追加到其中。
当用户停止录音时,我们将把整个原始文件转换为.wav(或其他)格式。很抱歉我不能发布完整的代码。希望这会给你提供一个方向来工作。

将数据追加到一个原始文件中,最后进行转换。 - Arun C
@Raghunandan 和 @Arun C,哪种变体具有更少的设备资源?是 "FileOutputStream" 还是 'com.googlecode.mp4parser:isoparser:1.0.2'? - Fortran
@Fortran 我不知道。我没有使用过mp4parser。 - Raghunandan

6
如果您仍然遇到这个问题,可以参考我在这里的答案。对于API级别大于或等于24的设备,Android MediaRecorder类中提供了暂停/恢复方法。 对于API级别低于24的设备 请在您的gradle文件中添加以下依赖:
compile 'com.googlecode.mp4parser:isoparser:1.0.2'

解决方案是在用户暂停时停止录制,在恢复时重新开始,正如stackoverflow中许多其他答案已经提到的那样。将所有生成的音频/视频文件存储在一个数组中,并使用下面的方法合并所有媒体文件。该示例取自mp4parser库,并根据我的需求进行了少量修改。

public static boolean mergeMediaFiles(boolean isAudio, String sourceFiles[], String targetFile) {
        try {
            String mediaKey = isAudio ? "soun" : "vide";
            List<Movie> listMovies = new ArrayList<>();
            for (String filename : sourceFiles) {
                listMovies.add(MovieCreator.build(filename));
            }
            List<Track> listTracks = new LinkedList<>();
            for (Movie movie : listMovies) {
                for (Track track : movie.getTracks()) {
                    if (track.getHandler().equals(mediaKey)) {
                        listTracks.add(track);
                    }
                }
            }
            Movie outputMovie = new Movie();
            if (!listTracks.isEmpty()) {
                outputMovie.addTrack(new AppendTrack(listTracks.toArray(new Track[listTracks.size()])));
            }
            Container container = new DefaultMp4Builder().build(outputMovie);
            FileChannel fileChannel = new RandomAccessFile(String.format(targetFile), "rw").getChannel();
            container.writeContainer(fileChannel);
            fileChannel.close();
            return true;
        }
        catch (IOException e) {
            Log.e(LOG_TAG, "Error merging media files. exception: "+e.getMessage());
            return false;
        }
    }

对于音频文件,请将使用标志 isAudio 设置为 true,对于视频文件,请将其设置为 false。


谢谢。你是救命恩人。 - oorosco

1

你好,我尝试使用你的MP4ParserWrapper类,但当我录制超过10分钟或者更长时间时,我的应用程序会崩溃并且文件没有保存。请问如何提高它的性能? - Srijith

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