"无法实例化提取器"使用资源FileDescriptor调用MediaExtractor.setDataSource

时间:2014-04-16 01:16:32

标签: android

我正在尝试使用AudioTrack解决SoundPool中的错误(循环声音不起作用)(如下所述:http://code.google.com/p/android/issues/detail?id=58113)。不幸的是,我甚至无法完成最初的工作。

我已经开始编写一个尝试打开音频资源(我的应用程序中的.ogg格式资源)并将其转换为AudioTrack对象的方法。到目前为止,我所要做的就是检查资源中的格式信息。我获得了资源的AssetFileDescription,然后一直到实际的FileDescriptor,然后我通过调用它的setDataSource()方法将其传递给我刚创建的MediaExtractor对象。

但是当我这样做时,该方法会发出错误并抛出异常。错误消息显示“无法打开libwvm.so”,异常是java.io.IOException,“无法实例化提取器”。

我甚至不知道从哪里开始诊断。有没有人有什么建议?我的应用程序中是否有任何可以检查的状态,它将详细阐述为什么 libwvm.so无法打开?有没有什么方法可以确认该错误实际上是提取器实例化失败的根本原因(毕竟,消息可能只是信息我猜)。或者也许有人可以解释代码实际上有什么问题?

以下是方法:

public AudioTrack load(Context context, int id) throws IOException
{
    Resources resources = context.getResources();
    AssetFileDescriptor asset = resources.openRawResourceFd(id);
    ParcelFileDescriptor parcel = null;
    MediaExtractor extractor = null;

    try
    {
        parcel = asset.getParcelFileDescriptor();
        FileDescriptor fd = parcel.getFileDescriptor();

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

        int trackCount = extractor.getTrackCount();

        for (int i = 0; i < trackCount; i++)
        {
            MediaFormat format = extractor.getTrackFormat(i);
            String mimeText= format.getString(MediaFormat.KEY_MIME);
        }
    }
    finally
    {
        if (extractor != null)
        {
            extractor.release();
        }

        if (parcel != null)
        {
            parcel.close();
        }
    }

    return null;
}

0 个答案:

没有答案