0

我正在使用 JB 的硬件媒体编解码器。我正在尝试对视频进行编码并对其进行解码并使用编解码器(视频/avc格式)显示...

我正在使用两个按钮来“开始”和“停止”视频渲染。第一次,当我渲染视频时,它会正确显示。当我第二次启动视频时,它没有显示并引发以下错误:

“不在 AVI 模式下”

我复制粘贴开始和停止按钮的代码片段。

     public void Stop(){
    try {
        //stopping the decoder alone
        decoderMediaCodec.flush();
        decoderMediaCodec.stop();
        decoderMediaCodec.release();
         //Tried with various combination of flush(), stop() and release();
    } catch (Exception e) {
        e.printStackTrace();
    }

    public void Start(Surface view){
    try {
        decoderMediaCodec = MediaCodec.createDecoderByType(mime);//Initialize the decoder again
        MediaFormat format = MediaFormat.createVideoFormat(mime, mWidth, mHeight);
        format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
        format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
        format.setInteger(MediaFormat.KEY_FRAME_RATE, framerate);
        decoderMediaCodec.configure(format, view, null, 0);
        decoderMediaCodec.start();


    } catch (Exception e) {
        e.printStackTrace();
    }
}

请帮助我进行视频渲染。

注意:在解码器中接收到的数据是有效的......使用超越比较工具检查数据

我为 outputBufferIndex 得到 -1

    int outputBufferIndex = decoderMediaCodec.dequeueOutputBuffer(bufferInfo, 0);

在日志中我得到

电子/(271):

E/( 271):不在 avi 模式

电子/(271):

E/( 271): 不在 avi 模式

4

1 回答 1

0

如果您在遇到问题时可以共享更多日志,那就太好了。从您的问题的描述中,您能否确认Surface为您的第二次Start调用传递的是有效句柄?

如果您可以重建android,可能启用日志跟踪Mediacodec.cpp会有所帮助,特别是Mediacodec::setNativeWindow方法。

PS:对于解码器,为什么要设置I帧间隔、比特率和帧率?

于 2013-02-09T00:02:15.143 回答