我不想使用ffmpeg。目前,我能够将m4a音频与mp4视频混合。我希望添加mp3音频,这也需要将mp3转换为m4a。我能够使用以下代码将wav转换为m4a,但不能将mp3转换为m4a

这是我的代码。

 private void convertAudio(String filename) throws IOException {

    String outputpath =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+"/converted.m4a";
    // Set up MediaExtractor to read from the source.

    MediaExtractor extractor = new MediaExtractor();
    extractor.setDataSource(filename);


    int trackCount = extractor.getTrackCount();

    // Set up MediaMuxer for the destination.
    MediaMuxer muxer;
    muxer = new MediaMuxer(outputpath, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
    // Set up the tracks.
    HashMap<Integer, Integer> indexMap = new HashMap<Integer, Integer>(trackCount);
    for (int i = 0; i < trackCount; i++) {
        extractor.selectTrack(i);
        MediaFormat format = extractor.getTrackFormat(i);
        format.setString(MediaFormat.KEY_MIME, MediaFormat.MIMETYPE_AUDIO_AMR_NB);

        int dstIndex = muxer.addTrack(format);
        indexMap.put(i, dstIndex);
    }
    // Copy the samples from MediaExtractor to MediaMuxer.
    boolean sawEOS = false;
    int bufferSize = 32000;
    int frameCount = 0;
    int offset = 100;
    ByteBuffer dstBuf = ByteBuffer.allocate(bufferSize);
    MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
   /* if (degrees >= 0) {
        muxer.setOrientationHint(degrees);
    }*/
    // Test setLocation out of bound cases

    muxer.start();
    while (!sawEOS) {
        bufferInfo.offset = offset;
        bufferInfo.size = extractor.readSampleData(dstBuf, offset);
        if (bufferInfo.size < 0) {

            sawEOS = true;
            bufferInfo.size = 0;
        } else {
            bufferInfo.presentationTimeUs = extractor.getSampleTime();
            bufferInfo.flags = extractor.getSampleFlags();
            int trackIndex = extractor.getSampleTrackIndex();
            muxer.writeSampleData(indexMap.get(trackIndex), dstBuf,
                    bufferInfo);
            extractor.advance();
            frameCount++;

        }
    }
    muxer.stop();
    muxer.release();

    return;
}

最佳答案

似乎该问题的答案(截至目前)是,在不使用“ffmpeg”的Android上,尚无可公开获得(即可搜索)的免费解决方案,用于将“mp3”转换为“m4a”。

但是,这并不意味着它不能完成:

  • 有人应该能够阅读相关的规范文档,然后执行转换。即编写一堆Java代码。实际上,ffmpeg本身的存在证明了这在技术上是可行的。在法律上也是如此。
  • 某人可能已经完成了该工作,因此选择不与他人共享。

  • 为什么没有免费的替代品?

    可能是因为没有人准备写一个。可能是因为那种倾向于免费这样做的人看不到重新发明轮子的意义!

    那你该怎么办?

    由于LGPL/GPL的许可限制,我假设您希望/需要“无ffmpeg的”实现。这很酷。但是,如果您不想适应开源方法(LGPL并不繁琐),那么您需要自己(或自己)解决问题。替代方法是:
  • 自己(或自己)编写软件。
  • 付钱为您完成编码工作。
  • 查找现有的商业实现并支付许可证费用。

  • 如果您(单独或集体)执行1或2,则可以选择免费(根据您选择的许可)或金钱向他人提供您的劳动成果或投资成果。

    关于android - 如何在Android中以编程方式将音频.mp3转换为.m4a,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33475239/

    10-10 19:38