首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中等渲染到表面慢

中等渲染到表面慢
EN

Stack Overflow用户
提问于 2016-04-29 16:03:48
回答 1查看 2.6K关注 0票数 3

我试图将数据(h.264原始数据1080 p)流到android,并将其呈现给表面view.The问题是,如果我发送数据的速度超过45 are,则解码器输出将被像素化(输入索引和输出索引为-1或未准备就绪)。

此外,如果我发送720 p或较低分辨率的视频,结果是相同的,我不能渲染(没有像素)超过45 the。

但是,如果在releaseOutputBuffer()中将呈现标志设置为"False“,则可以实现75fps (我收到的输入和输出索引是正常的)

那么有办法“解锁”帧速率吗?或者另一种更快的渲染方式。

注意:我在ndk里面做这件事。

Init解码器()

代码语言:javascript
复制
AMediaFormat *AVm_format = AMediaFormat_new();
AMediaFormat *AVm_formattesting = AMediaFormat_new();
AVm_codec = AMediaCodec_createDecoderByType("video/avc");
AVm_formattesting =AMediaCodec_getOutputFormat(AVm_codec);
int formatint=0;
AMediaCodec_createCodecByName("OMX.qcom.video.decoder.avc");
    AMediaFormat_setString(AVm_format,AMEDIAFORMAT_KEY_MIME,"video/avc");
    AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_HEIGHT,1920);
    AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_WIDTH,1080);
        AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_COLOR_FORMAT,13);
    try {

        AMediaCodec_configure(AVm_codec, AVm_format, Nwindow, NULL, 0);
        LOGD("Configure finished...\n");
        AMediaCodec_start(AVm_codec);
        LOGD("Decoder started\n");
    }catch(std::exception e){

        LOGD("FAILED TO CONFIGURE DECODER\n");

    }

译码(.)

代码语言:javascript
复制
//pData is the frame I recive
//sz is the size of the frame

ssize_t indx = AMediaCodec_dequeueInputBuffer(AVm_codec, 0);


    if (indx >= 0) {
        input = AMediaCodec_getInputBuffer(AVm_codec, indx, &insize);

     // memset(input,0,sz);
        memcpy(input,pData,sz);
        AMediaCodec_queueInputBuffer(AVm_codec, indx, 0, sz, 0, 0);
    }

    ssize_t indy = AMediaCodec_dequeueOutputBuffer(AVm_codec, AVm_buffinfo, 0);

    if (indy >= 0) {
        AMediaCodec_releaseOutputBuffer(AVm_codec, indy, false);
    } else if(indy == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED){
        LOGD("output buffers changed\n");
    } else if (indy == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) {
        AMediaFormat *format = NULL;
        format = AMediaCodec_getOutputFormat(AVm_codec);
        LOGD("format changed to: %s", AMediaFormat_toString(format));
        AMediaFormat_delete(format);
        LOGD("format changed to:\n");
    } else if (indy == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
        LOGD("no output buffer right now\n");

    } else {
        LOGD("unexpected info code: %zd\n", indy);

     }

如果还需要什么请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-29 20:10:20

我不完全确定发生了什么--解码帧被传送到SurfaceView的速率不应该影响输出的质量。这听起来更像是将数据输入解码器的方式上的问题,例如,您正在覆盖一个仍在读取的H.264数据缓冲区。

发送到SurfaceView的Surface的帧不会被删除,所以如果您试图以比设备刷新速度更快的速度给它提供帧,您的releaseOutputBuffer(..., true)就会阻塞它。在大多数设备上,这是60 most。您可以更多地了解系统在图形体系结构文档中的工作方式。

要记住的一件事是,解码后的视频帧不是由releaseOutputBuffer()呈现的,而是由转发的。IPC事务有一些成本,但我预计您所看到的大部分都是呼叫阻塞的影响,以保持每帧16.7ms的稳定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36942910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档