我正在尝试使用以下MediaExtractor示例:
http://bigflake.com/mediacodec/ - ExtractMpegFramesTest.java(需要4.1,API 16)
我遇到的问题是outputSurface.awaitNewImage(); 似乎总是抛出RuntimeException("frame wait timed out"),每当mFrameSyncObject.wait(TIMEOUT_MS)调用超时时抛出它.无论我设置什么TIMEOUT_MS,onFrameAvailable()总是在超时发生后立即调用.我尝试了50毫秒和30000毫秒,它是相同的.
似乎onFrameAvailable()在线程繁忙时无法进行调用,并且一旦超时发生并结束线程代码执行,它就可以解析onFrameAvailable()调用.
有没有人设法让这个例子工作,或者知道MediaExtractor应该如何使用GL纹理?
编辑:在使用API 4.4和4.1.1的设备上尝试了这一点,两者都发生了同样的情况.
编辑2:
得益于fadden 4.4.问题是ExtractMpegFramesWrapper.runTest()调用的方法th.join();阻塞了主线程并阻止了onFrameAvailable()调用的处理.一旦我评论th.join();它就适用于4.4.我想也许ExtractMpegFramesWrapper.runTest()本身应该在另一个线程上运行,所以主线程没有被阻止.
4.1.2调用时还有一个小问题codec.configure(),它给出了错误:
A/ACodec(2566): frameworks/av/media/libstagefright/ACodec.cpp:1041 CHECK(def.nBufferSize >= size) failed.
A/libc(2566): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 2625 (CodecLooper)
Run Code Online (Sandbox Code Playgroud)
通过在通话前添加以下内容我解决了这个问题:
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
Run Code Online (Sandbox Code Playgroud)
然而,我现在在4.1.1(Galaxy S2 GT-I9100)和4.1.2(三星Galaxy Tab GT-P3110)上的问题是它们都始终将info.size设置为0以用于所有帧.这是日志输出:
loop
input buffer not available
no output from decoder available
loop
input …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MediaCodec和MediaMux,我遇到了一些麻烦.
以下是logcat的错误:
12-13 11:59:58.238: E/AndroidRuntime(23218): FATAL EXCEPTION: main
12-13 11:59:58.238: E/AndroidRuntime(23218): java.lang.RuntimeException: Unable to resume activity {com.brendon.cameratompeg/com.brendon.cameratompeg.CameraToMpeg}: java.lang.IllegalStateException: Can't stop due to wrong state.
12-13 11:59:58.238: E/AndroidRuntime(23218): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2918)
Run Code Online (Sandbox Code Playgroud)
代码在"mStManager.awaitNewImage();"处出错,它位于onResume函数中.logcat说"相机帧等待时间".
mStManager是SurfaceTextureManager类的一个实例.并且"相机帧等待时间"来自awaitNewImage()函数.我已将该课程添加到我的帖子中.
我的部分代码是这样的(onCreate函数和onResume函数):
@Override
protected void onCreate(Bundle savedInstanceState) {
// arbitrary but popular values
int encWidth = 640;
int encHeight = 480;
int encBitRate = 6000000; // Mbps
Log.d(TAG, MIME_TYPE + " output " + encWidth + "x" + encHeight + " @" + encBitRate);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_to_mpeg);
prepareCamera(encWidth, encHeight);
prepareEncoder(encWidth, encHeight, …Run Code Online (Sandbox Code Playgroud)