小编AMG*_*AMG的帖子

如何将一个音频文件覆盖另一个音频文件并保存?

我想要完成的是将音轨覆盖在音轨上以形成新的歌曲轨道.

这是我的一些代码.我正在阅读vocal.mp3使用FileInputStream,然后将其保存到像这样的字节数组...

        try {
            fis = new FileInputStream(myFile);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        bos = new ByteArrayOutputStream();
        byte[] buf = new byte[2048];
        try {
            for (int readNum; (readNum = fis.read(buf)) != -1;) {
                bos.write(buf, 0, readNum);
                System.out.println("read " + readNum + " bytes,");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } 

        bytes = bos.toByteArray();
Run Code Online (Sandbox Code Playgroud)

然后......我做了同样的事情music.mp3并将其读入一个单独的字节数组.我不打算为此显示代码,因为它与上面相同.

在我有两个单独的字节数组后,我可以将它们组合起来......

        outputStream = new ByteArrayOutputStream( );
        try {
            outputStream.write( bytes );
            outputStream.write( …
Run Code Online (Sandbox Code Playgroud)

arrays audio merge android overlay

5
推荐指数
1
解决办法
1187
查看次数

如何使用 MediaMuxer 混合两个音频样本并编码回音频文件

我目前有两个单独的媒体提取器和编解码器,用于将每个单独的样本分解为ByteBuffers。然后我将每个样本存储到两个short数组中。然后我调用我的混合函数,它将两个样本合并为一个short[],如果我short[]AudioTrack它来播放,结果会很好,两种声音都可以根据需要同时播放。

但是,我真正想做的是使用MediaMuxer将我的新short[]文件转换回 mp4 音频文件并将其存储到设备以供以后播放。有人可以帮我弄清楚我做错了什么吗?

这是我拥有的一些代码......正如你所看到的,我注释掉了AudioTrack,这就是我试图将short[]背面变成 的地方,ByteBuffer所以我可以使用媒体复用器来创建音频文件。这给我的结果是一个新的音频文件,它是存储在我设备上的正确名称和总长度……但是当我尝试播放它时……它在几分之一秒内从头跳到尾,实际上并没有播放和音频。

        songOutPath = Environment.getExternalStorageDirectory()+"/My Folder/song.raw";
        muxer = new MediaMuxer(songOutPath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
        mTrackIndex = muxer.addTrack(format);
        muxer.start();
        mMuxerStarted = true;

        MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
        final long timeoutUs = 5000;
        boolean sawInputEOS = false;
        boolean sawOutputEOS = false;
        int noOutputCounter = 0;

        MediaCodec.BufferInfo info2 = new MediaCodec.BufferInfo();
        final long timeoutUs2 = 5000;
        boolean sawInputEOS2 = false;
        boolean sawOutputEOS2 …
Run Code Online (Sandbox Code Playgroud)

mp4 android mediamuxer android-mediacodec

5
推荐指数
1
解决办法
1842
查看次数

标签 统计

android ×2

android-mediacodec ×1

arrays ×1

audio ×1

mediamuxer ×1

merge ×1

mp4 ×1

overlay ×1