媒体提取器显示“无法实例化提取器”

媒体提取器显示“无法实例化提取器”,第1张

概述我正在尝试在用于Android上OGG文件格式的音频流的媒体提取器上工作.我已经在Google文档的帮助下编写了一些代码.但它根本不起作用.可能是我写错了代码或语法,因为我是学生.它显示我无法实例化提取器publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInst

我正在尝试在用于Android上OGG文件格式的音频流的媒体提取器上工作.
我已经在Google文档的帮助下编写了一些代码.但它根本不起作用.
可能是我写错了代码或语法,因为我是学生.
它显示我无法实例化提取器

public voID onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentVIEw(R.layout.activity_main);MediaExtractor extractor = new MediaExtractor();extractor.setDataSource("http://examplelink.com/ogg");// I cant put real link so sorry for thatint numTracks = extractor.getTrackCount();for (int i = 0; i < numTracks; ++i) {    MediaFormat format = extractor.getTrackFormat(i);    String mime = format.getString(MediaFormat.KEY_MIME);    extractor.selectTrack(i);    ByteBuffer inputBuffer = ByteBuffer.allocate(1024);    while (extractor.readSampleData(inputBuffer,0) >= 0) {            int trackIndex = (int) extractor.getSampleTime();            long presentationTimeUs = extractor.getSampleTime();    }    MediaCodec codec = MediaCodec.createDecoderByType(mime);    codec.configure(format, null /* surface */, null /* crypto */, 0 /* flags */);    codec.start();    ByteBuffer[] inputBuffers = codec.getinputBuffers();    ByteBuffer[] outputBuffers = codec.getoutputBuffers();    format = codec.getoutputFormat();    Long timeoutUs=(long) 1;    for (;;) {        int inputBufferIndex = codec.dequeueinputBuffer(timeoutUs);        if (inputBufferIndex >= 0) {            // fill inputBuffers[inputBufferIndex] with valID data            codec.queueinputBuffer(inputBufferIndex, 0, 128, 0,0);        }        MediaCodec.BufferInfo info = new BufferInfo();        int outputBufferIndex = codec.dequeueOutputBuffer(info, timeoutUs);        if (outputBufferIndex >= 0) {            // outputBuffer is ready to be processed or rendered.            codec.releaSEOutputBuffer(outputBufferIndex, false);        } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {            outputBuffers = codec.getoutputBuffers();        } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {            // Subsequent data will conform to new format.            format = codec.getoutputFormat();            AudioTrack mAudioTrack = null;            mAudioTrack.setPlaybackRate(format.getInteger(MediaFormat.KEY_SAMPLE_RATE));        }        codec.stop();        codec.release();        codec = null;    }}

}

解决方法:

我假设您的问题是“为什么它根本不起作用?”
通常,这是一个太大的问题,但在这种情况下,对我来说,您似乎根本不了解MediaExtractor& MediaCodec的工作.

并不是所有的错.该文件是含糊的,请客气地说.
但是,我已经成功地通过这种方式播放了音频文件.

我的方案假定MediaCodec实现了缓冲区的异步队列.这个队列中似乎有大约4个缓冲区.

因此,我使用2个线程:一个线程将来自MediaExtractor的数据放入队列中,另一个线程将已解码的音频从队列中取出并将其写入AudioTrack.

然后,我需要非常小心,例如避免在搜索过程中出现死锁.我最终得到的代码比您多得多.我不知道该如何避免!

我正在考虑尝试视频.任何有用的参考将不胜感激!

总结

以上是内存溢出为你收集整理的媒体提取器显示“无法实例化提取器”全部内容,希望文章能够帮你解决媒体提取器显示“无法实例化提取器”所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1085537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存