Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中以编程方式将audio.mp3转换为.m4a_Android_Mp3_M4a_Mediamuxer - Fatal编程技术网

如何在android中以编程方式将audio.mp3转换为.m4a

如何在android中以编程方式将audio.mp3转换为.m4a,android,mp3,m4a,mediamuxer,Android,Mp3,M4a,Mediamuxer,我不想使用ffmpeg。目前,我能够将m4a音频与mp4视频进行多路复用。我想添加mp3音频也需要mp3到m4a转换。我能够转换wav到m4a,但不能用下面的代码将mp3转换为m4a 这是我的密码 private void convertAudio(String filename) throws IOException { String outputpath =Environment.getExternalStoragePublicDirectory(Environment.DIRE

我不想使用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;
}
private void convertAudio(字符串文件名)引发IOException{
字符串outputpath=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+“/converted.m4a”;
//将MediaExtractor设置为从源读取。
MediaExtractor提取器=新的MediaExtractor();
extractor.setDataSource(文件名);
int trackCount=extractor.getTrackCount();
//为目标设置MediaMuxer。
MediaMuxer-muxer;
muxer=newmediamuxer(outputpath,MediaMuxer.OutputFormat.muxer\u OUTPUT\u MPEG\u 4);
//设置轨道。
HashMap indexMap=新的HashMap(trackCount);
对于(int i=0;i=0){
muxer.setOrientationHint(度);
}*/
//测试设置位置越界情况
muxer.start();
而(!sawEOS){
bufferInfo.offset=偏移量;
bufferInfo.size=提取器.readSampleData(dstBuf,偏移量);
如果(bufferInfo.size<0){
sawEOS=真;
bufferInfo.size=0;
}否则{
bufferInfo.presentationTimeUs=提取器.getSampleTime();
bufferInfo.flags=提取器.getSampleFlags();
int trackIndex=extractor.getSampleTrackIndex();
muxer.writeSampleData(indexMap.get(trackIndex),dstBuf,
缓冲信息);
提取器;
frameCount++;
}
}
muxer.stop();
muxer.release();
返回;
}

这个问题的答案(到目前为止)似乎是,在不使用“ffmpeg”的Android上,没有公开的(即可搜索的)免费解决方案可以将“mp3”转换为“m4a”

但是,这并不意味着不能这样做:

  • 有人应该能够阅读相关规范文件,然后实施转换;i、 编写一堆Java代码。事实上,ffmpeg本身的存在证明了这在技术上是可行的。法律上也是如此

  • 有人可能已经完成了这项工作,并选择不与他人分享

为什么没有免费的替代品? 也许。。。因为没有人准备写一本。可能是因为那些倾向于免费这么做的人看不到重新发明轮子的意义

那你该怎么办? 由于LGPL/GPL的许可限制,我假定您想要/需要一个“ffmpeg免费”实现。那很酷。但是,如果您不想适应开源方式(而且LGPL并不繁重),那么您需要为自己(或自己)解决这个问题。备选方案是:

  • 自己(或自己)编写软件
  • 付钱给某人为你做编码工作
  • 查找现有的商业实现并支付许可证费用

  • 如果你(个人或集体)做了1或2,那么你可以选择将你的劳动或投资成果免费(根据你选择的任何许可证)或金钱提供给他人

    目前,我正在努力将音频和视频与media muxer合并,但我失败了。u plz能否通过共享您的合并代码来帮助我这是我的问题:未知mime类型“audio/mpeg”。12-09 11:58:33.569:A/MPEG4Writer(332):frameworks/av/media/libstagefright/MPEG4Writer.cpp:2699检查(!“不应该在这里,未知mime类型。”)是否找到将mp3转换为m4a的方法?如果你已经做了,就分享吧,thx。这个问题的困惑在于mp3和m4a是两个不同的东西。Mp3是音频编解码器,m4a只是mp4容器的另一个文件扩展名。虽然AAC是mp4中最常用的音频编解码器,但将MP3放入mp4中是完全有效的。所以不需要转换。只需将mp3多路复用到mp4容器中。