Android   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android MediaExtractor readSampleData IllegalArgumentException大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我尝试按照这个问题Concatenate multiple mp4 audio files using android´s MediaMuxer并连接视频文件.

但由于某种原因,当我调用readSampleData时,MediaExtractor会抛出IllegalArgumentexception

在官方API中,此函数不应该抛出任何异常!这是怎么回事 ?

发现了@L_772_4@旧问题,表明ByteBuffer的大小可能是负责的:Android MediaMuxer readSampleData IllegalStateException

我已经尝试了大量的大小值,但没有@L_772_4@让问题消失.我应该知道标准尺寸吗?

任何提示都可以提供帮助!

    Boolean VERBOSE = true;


private Boolean concatenateFiles(File dst, List<File> sources) {
    if ((sources == null) || (sources.size() == 0)) {
        return false;
    }

    Boolean result;
    MediaExtractor extractor = null;
    MediaMuxer muxer = null;
    try {
        // Set up MediaMuxer for the desTination.
        muxer = new MediaMuxer(dst.getPath(), MediaMuxer.outputFormat.MUXER_OUTPUT_MPEG_4);

        // Copy the samples from MediaExtractor to MediaMuxer.
        Boolean sawEOS = false;

        int frameCount = 0;
        int offset = 100;

        ByteBuffer dstBuf = ByteBuffer.allocate(256 * 1024);
        BufferInfo bufferInfo = new BufferInfo();

        long timeOffsetUs = 0;
        int dstTrackIndex = -1;

        for (int fileIndex = 0; fileIndex < sources.size(); fileIndex++) {
            int numberOfSamplesInsource = getnumberOfSamples(sources.get(fileIndeX));
            if (VERBOSE) {
                Log.d(tag, String.format("source file: %s", sources.get(fileIndeX).getPath()));
            }

            if (!sources.get(fileIndeX).canRead()) {
                throw new FileNotFoundException("Unable to read " + sources.get(fileIndeX));
            }

            // Set up MediaExtractor to read from the source.
            extractor = new MediaExtractor();
            extractor.setDatasource(sources.get(fileIndeX).getPath());

            // Set up the tracks.
            SparseIntArray indexMap = new SparseIntArray(extractor.getTrackCount());
            for (int i = 0; i < extractor.getTrackCount(); i++) {
                extractor.SELEctTrack(i);
                MediaFormat format = extractor.getTrackFormat(i);
                if (dstTrackIndex < 0) {
                    dstTrackIndex = muxer.addTrack(format);
                    muxer.start();
                }
                indexMap.put(i, dstTrackIndeX);
            }

            long lastPresentationTimeUs = 0;
            int currentSample = 0;

            while (!sawEOS) {
                bufferInfo.offset = offset;

                bufferInfo.size = extractor.readSampleData(dstBuf, offset);


                if (bufferInfo.size < 0) {
                    sawEOS = true;
                    bufferInfo.size = 0;
                    timeOffsetUs += (lastPresentationTimeUs);
                }
                else {
                    lastPresentationTimeUs = extractor.getSampleTime();
                    bufferInfo.presentationTimeUs = extractor.getSampleTime() + timeOffsetUs;
                    bufferInfo.flags = extractor.getSampleFlags();
                    int trackIndex = extractor.getSampleTrackIndex();

                    if ((currentSample < numberOfSamplesInsourcE) || (fileIndex == sources.size() - 1)) {
                        muxer.writeSampleData(indexMap.get(trackIndeX), dstBuf, bufferInfo);
                    }
                    extractor.advance();

                    frameCount++;
                    currentSample++;
                    if (VERBOSE) {
                        Log.d(tag, "Frame (" + frameCount + ") " +
                                "PresentationTimeUs:" + bufferInfo.presentationTimeUs +
                                " Flags:" + bufferInfo.flags +
                                " TrackIndex:" + trackIndex +
                                " Size(KB) " + bufferInfo.size / 1024);
                    }
                }
            }
            extractor.release();
            extractor = null;
        }

        result = true;
    }
    catch (Exception E) {
        e.printStackTrace();
        result = false;
    }
    finally {
        if (extractor != null) {
            extractor.release();
        }
        if (muxer != null) {
            muxer.stop();
            muxer.release();
        }
    }
    return result;
}

解决方法:

在解码4k电影时遇到此错误.其他人(包括其他非常高分辨率的电影)一直工作得很好,但是大约在一半的时间 – 在@L_772_4@更复杂的场景附近 – 我得到了这个错误.

我的缓冲区大小为1mb(1024 * 1024),增加到2mb,问题就消失了.

所以你在源代码中找到的END_OF_STREAM可能是“缓冲区的结尾”

大佬总结

以上是大佬教程为你收集整理的Android MediaExtractor readSampleData IllegalArgumentException全部内容,希望文章能够帮你解决Android MediaExtractor readSampleData IllegalArgumentException所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: