MediaExtractor.setDataSource抛出IOException"无法实例化提取器"

时间:2014-05-12 14:51:09

标签: java android video mediacodec

我在Android 4.2上调用MediaExtractor.setDataSource,而有时会抛出“无法实例化提取器”的IOException。我已经找到了从C ++实现中抛出的地方,但它没有帮助。

其他有同样问题并且没有答案或答案对我没有帮助的人是:

android.media.MediaExtractor. Anyone got this beast to work? "Failed to instantiate extractor" exception

media extractor show "failed to instantiate extractor"

Failed to instantiate mediaextractor when using setDataSource()

在拼命想要解决这个问题的过程中,我写了一篇最小的应用程序来展示它:

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  public boolean doStuff(View view) {
    File f = getExternalFilesDir(null);
    File[] files = f.listFiles();
    for (File file : files) {
      if (file.isFile()) {
        Log.e("Andy", "trying file [" + file.getName() + "]");
        startExtractor(file);
      }
    }
    return true;
  }
  private void startExtractor(File f) {
    MediaExtractor extractor = new MediaExtractor();
    try {
      extractor.setDataSource(f.getAbsolutePath());
    } catch (IOException e) {
      Log.e("Andy", "splat " + e.getMessage());
    }
    extractor.release();
  }
}

此应用的活动只有一个按钮,调用“doStuff”。输出如下:

05-12 15:27:42.639: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:27:42.689: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:27:42.689: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:27:42.709: E/Andy(18757): trying file [test.mp4]
05-12 15:27:55.039: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:27:55.119: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:27:55.149: E/Andy(18757): trying file [test.mp4]
05-12 15:28:03.209: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:03.259: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:28:03.259: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:03.279: E/Andy(18757): trying file [test.mp4]
05-12 15:28:12.289: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:12.379: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:12.419: E/Andy(18757): trying file [test.mp4]
05-12 15:28:17.879: E/Andy(18757): trying file [aaitn.mp4]
05-12 15:28:17.929: E/Andy(18757): trying file [unusual aspect.mp4]
05-12 15:28:17.949: E/Andy(18757): splat Failed to instantiate extractor.
05-12 15:28:17.949: E/Andy(18757): trying file [test.mp4]

这有点令人困惑。

  • 它有时会起作用,有时候不会
  • 第一次尝试失败了。

现在,我很确定其他人正在使用这个界面并且它正在为他们工作,这或者意味着我正在使用的设备(MK808s)已经破坏固件,或者有一个我不想做的技巧它可靠。有没有人有任何想法?

除非GC启动,否则logcat非常清晰,GC时间与问题无关。

修改

我更改了按钮,以便启动一个在所有三个文件上循环1000次的线程。它一路奔跑,没有麻烦。很头疼。我发现如果我在该线程运行时摆动鼠标它开始失败,但是一旦我放手它就会重新开始工作。运行另一个线程,只是在做数学一段时间混乱没有导致它。在真实世界的应用程序来自,删除鼠标不会让问题消失,但它是一个很大的应用程序,并做了很多其他的东西。

5 个答案:

答案 0 :(得分:4)

看来,如果我不是要求它从文件中提取,而是自己打开文件,获取输入流,从输入流中获取FileDescriptor,然后让它从文件描述符中提取,它每次都有效。即使我摆动鼠标!

我将粉笔记录到android中的一个bug,然后用这个副本粘贴回答其他人的问题。在这种情况下,不确定这是否是正确的协议?

答案 1 :(得分:3)

对我来说,接受的答案没有用。我必须指定起始偏移量和长度:

// Assuming a raw resource located at "res/raw/test_audio.mp3"
MediaExtractor extractor = new MediaExtractor();
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.test_audio);
try {
    extractor.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
    e.printStackTrace();
}

答案 2 :(得分:3)

对我来说,我有同样的问题。 因为我在清单中忘记了宣布的许可。     

也许你可以检查一下。

答案 3 :(得分:3)

正如安迪在this帖子中所写的那样,以下是示例代码:

MediaExtractor extractor = new MediaExtractor();
File file = new File(pathToFile);
FileInputStream fis = null;
try {
    fis = new FileInputStream(file);
    FileDescriptor fd = fis.getFD();
    extractor.setDataSource(fd);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    //Release stuff
    extractor.release();
    try {
        if(fis != null) {
            fis.close();
        }
    } catch (Exception e){
        e.printStackTrace();
    }
}

答案 4 :(得分:0)

我遇到了同样的问题。在我将文件直接移动到资产文件夹中后,它对我有用,而不是将其保存在子文件夹中。