我在Android 4.2上调用MediaExtractor.setDataSource,而有时会抛出“无法实例化提取器”的IOException。我已经找到了从C ++实现中抛出的地方,但它没有帮助。
其他有同样问题并且没有答案或答案对我没有帮助的人是:
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次的线程。它一路奔跑,没有麻烦。很头疼。我发现如果我在该线程运行时摆动鼠标它开始失败,但是一旦我放手它就会重新开始工作。运行另一个线程,只是在做数学一段时间混乱没有导致它。在真实世界的应用程序来自,删除鼠标不会让问题消失,但它是一个很大的应用程序,并做了很多其他的东西。
答案 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)
我遇到了同样的问题。在我将文件直接移动到资产文件夹中后,它对我有用,而不是将其保存在子文件夹中。