我在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();
  }
}

该应用程序的 Activity 只有一个按钮,称为“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]

这在某些方面令人困惑。
  • 有时有效,有时不起作用
  • 第一次尝试失败。

  • 现在,我相当确定其他人正在使用此接口(interface),并且该接口(interface)正在为他们使用,这意味着我正在使用的设备(MK808)的固件已损坏,或者我缺少使它可靠的诀窍。有人有什么想法吗?

    除了GC启动时,logcat非常清晰,而且GC计时与问题无关。

    编辑

    我更改了按钮,以使其启动一个线程,该线程在所有三个文件上循环了1000次。它一直运行,没有麻烦。很多头抓挠。我发现,如果在该线程运行时摆动鼠标,它将开始失败,但是一旦松开,它将再次开始工作。运行另一个只是搞乱了一段时间的线程并没有导致它。在实际的应用程序中,删除鼠标并不能解决问题,但这是一个很大的应用程序,它还会执行许多其他操作。

    最佳答案

    对我来说,被接受的答案是行不通的。我必须指定起始偏移量和长度:

    // 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();
    }
    

    10-07 22:07