Tag: mediacodec

使用MediaCodec和MediaMuxer编码和混合video

我正在开发一个应用程序,我解码一个video,并replace某些帧,并使用MediaMuxer和MediaCodec重新编码。 该应用程序的作品,如果我不replace任何帧(除了1080p的video,我下面解释),但是当我这样做,replace后的帧是像素化,video是断断续续的。 另外,当我用1920×1080的video试用我的应用程序时,我得到一个奇怪的输出,video没有显示任何东西,直到我滚动到video的开始,然后video开始出现(但与之前提到的相同的问题编辑后的pixalation。 以下是我如何configuration我的编码器: Video_format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, interval); Video_format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); Video_format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate); Video_format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0); int color_format=MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar; Video_format.setInteger(MediaFormat.KEY_COLOR_FORMAT, color_format); encoder.configure(Video_format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); 所以总结一下,我有两个问题: 1-像素化帧和修改后的帧video波涛汹涌。 2-破坏1920x1080video,除非我滚动到开始。 编辑 这是一个未经编辑的1080pvideo样本,当我在VLC上播放时,会出现一个绿色屏幕,并且在电话上播放不正确,除非我开始在YouTube上滚动并且现在奇怪地正常工作,除了开始时的绿框 这里是一个720p的video样本,编辑时也是一个绿色的框架和编辑后的清晰的像素化和滞后 这里是我用来解码重新编码的代码: do{ Bitmap b1; if(edited_frames.containsKey(extractor.getSampleTime())) b1=BitmapFactory.decodeFile(edited_frames.get(extractor.getSampleTime())); else b1=decode(extractor.getSampleTime(),Preview_width,Preview_Height); if(b1==null) continue; Bitmap b_scal=Bitmap.createScaledBitmap(b1, Preview_width, Preview_Height, false); if(b_scal==null) continue; encode(b_scal, encoder, muxer, videoTrackIndex); lastTime=extractor.getSampleTime(); }while(extractor.advance()); 解码方法: private Bitmap decode(final long time,final […]

Adreno GPU上的编码器崩溃,同时从Surface进行编码

我一直在为这个问题苦苦挣扎了一个多星期,很可能这是Qualcomm GPU /硬件video编码器中的一个错误。 由于我们被迫发布应用程序,他们的开发者论坛没有提供任何反馈,所以我也在这里发布,希望有人能够提供一些线索,甚至更好的解决方法,以便编码器中的错误是没有触发。 该应用程序从Surface进行编码。 当某些图像渲染到表面时,编码器在同一位置(当前正在编码的帧是关键帧)失败(100%)。 编码器在碰撞点的Logcat输出是(最后一行以非常高的速率重复): 11-26 11:41:33.312: E/OMX-VENC-720p(25949): ERROR: async_msg_process() – Error statuscode = 1 11-26 11:41:33.312: E/ACodec(29317): [OMX.qcom.video.encoder.avc] ERROR(0x80001009) 11-26 11:41:33.312: E/MediaCodec(29317): Codec reported an error. (omx error 0x80001009, internalError -2147483648) 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: venc_use_buf:set input buffer failed 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: in dev_use_buf 11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: empty_buffer_done() failed! 11-26 […]

SurfaceTexture的onFrameAvailable()方法总是调用得太晚

我试图让下面的MediaExtractor例子工作: http://bigflake.com/mediacodec/ – ExtractMpegFramesTest.java(需要4.1,API 16) 我有的问题是outputSurface.awaitNewImage(); 似乎总是抛出RuntimeException(“帧等待超时”),这是每当mFrameSyncObject.wait(TIMEOUT_MS)调用超时引发的。 无论我设置了TIMEOUT_MS , onFrameAvailable()总是在超时发生后立即被调用。 我尝试了50ms和30000ms,这是一样的。 在线程忙的时候, onFrameAvailable()调用看起来不可能完成,一旦超时发生,线程代码执行结束,它可以parsingonFrameAvailable()调用。 有没有人设法让这个例子工作,或知道如何MediaExtractor应该与GL纹理工作? 编辑:在API 4.4和4.1.1的设备上尝试过,两者都发生同样的情况。 编辑2: 得到它的工作4.4感谢fadden。 问题是th.join();方法调用th.join(); 它阻塞了主线程并阻止了onFrameAvailable()调用的处理。 一旦我评论th.join(); 它适用于4.4。 我想也许ExtractMpegFramesWrapper.runTest()本身应该在另一个线程上运行,所以主线程不会被阻止。 在调用codec.configure()时4.1.2上也有一个小问题,它给出了错误: 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) 我在通话前join以下内容解决了这个问题: format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0); 然而,我现在在4.1.1(Galaxy S2 GT-I9100)和4.1.2(三星Galaxy Tab GT-P3110)上的问题是,它们都将info.size设置为0。 这里是日志输出: loop input buffer not available […]