3wnae

3wnae

0个粉丝

9

问答

0

专栏

0

资料

3wnae  发布于  2016-06-22 14:56:43
采纳率 0%
9个问答
4538

解码实时流遇到I帧时会卡顿 [已解决]

 
本帖最后由 3wnae 于 2016-6-23 20:34 编辑

void FileLiveSink::addData(unsigned char const* data, unsigned dataSize,
                       struct timeval presentationTime) {
    if(dataSize != 0)
    {
        //printf("%d\n", dataSize);
#if 1
        do {
            if(is_ready_recv_stream(fFifo_id) == 0)
            {
                break;
            }

            if(USER_AVPlayGetBuf(fFifo_id, dataSize, &fStreamBuf) != HI_SUCCESS)
            {
                break;
            }

            memcpy(fStreamBuf.pu8Data, data, dataSize);            
            USER_AVPlayPutBuf(fFifo_id, fStreamBuf.u32Size);
        }while(0);
#else
        if(fLiveDataCallBack != NULL)
        {
            fLiveDataCallBack(fFifo_id, (const char*)data, dataSize, NULL);
        }
#endif
    }
}

我是从live555获取摄像头的实时流直接放到解码器中进行解码。当解码400w摄像头(大华)时,I帧有400多k。 一遇到I帧视频就会有明显的卡顿。解200w是没问题的。是不是数据太大拷贝数据花的时间长,导致的卡顿。
不知道有没有遇到相同问题的?
我来回答
回答6个
时间排序
认可量排序

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 15:20:06
认可0
本帖最后由 ngswfx 于 2016-6-22 15:28 编辑

大分辨率才卡。我给你提供点思路(不一定对):

我感觉首先关注一下,内存分配的事,以前看到过类似的描述,说是海斯底层会申请解码用的内存,要是申请失败,如果多次尝试....   这个我仅仅是怀疑。如果多路解码,缓冲池子不够,各个图像抢缓冲。

另外:关注一下cpu占用率。
400K memcpy一下我感觉不至于,但需要关注cpu占用率,如果到了80%占用了,memcpy等数据操作部分慢,达到负荷极限,就难说了。

当然最为关键的,是仔细看图像,卡的时候,有没有任何图像错误(尤其看有没有丢帧),如果有稍微的花屏或者丢帧了,那就好理解了。通常的代码,为了节约内存,不会分配太多内存,如果来了个超级大家伙,整个流程都要分配内存。

如果没有适应机制,还会出错,通常就解不出来了,或者花屏(缓冲小,只有部分数据送入解码器了),即便有适应机制,也要看这个流程中,会不会太占时间。

3wnae

0个粉丝

9

问答

0

专栏

0

资料

3wnae 2016-06-22 16:13:16
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32134&ptid=11695]ngswfx 发表于 2016-6-22 15:20[/url]
大分辨率才卡。我给你提供点思路(不一定对):

我感觉首先关注一下,内存分配的事,以前看到过类似的描 ...[/quote]

视频数据倒是没问题。视频也不会花。
cpu占用率时没问题的只有10%左右。

我在试试直接解文件会不会卡。

3wnae

0个粉丝

9

问答

0

专栏

0

资料

3wnae 2016-06-22 16:44:39
认可0


]刚刚试了下将视频流保存在一个文件里,用hi的sample代码解码是不会有卡顿现象的。去该是取实时视频流往解码器送的过程中有问题。

3wnae

0个粉丝

9

问答

0

专栏

0

资料

3wnae 2016-06-22 22:00:44
认可0
找到原因了。 可能是摄像头在编码I帧或传输I帧时花了比较长时间。 算了下大概离接收到上一个P帧停顿了300ms才接收到I帧。

还是得弄个环形buff出来。缓存一段数据。

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-06-23 10:18:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32207&ptid=11695]3wnae 发表于 2016-6-22 22:00[/url]
找到原因了。 可能是摄像头在编码I帧或传输I帧时花了比较长时间。 算了下大概离接收到上一个P帧停顿了300ms ...[/quote]

问题解决请结贴

qn1511427601

0个粉丝

0

问答

0

专栏

0

资料

qn1511427601 2019-01-09 10:31:06
认可0
这个我加缓冲区还是卡啊  请问goodman   怎么处理的
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区