[hevc @ 000001716438fc00] Two slices reporting being the first in the same frame.
[hevc @ 000001716439ec80] Could not find ref with POC 2
现象: 解码H264流的时候一切正常,解码H265流出现以上错误,并且经常花屏
网上查到的办法是:
(1)修改ffmpeg的udp的接收缓冲区大小,设置为1024000
(2)改变ffmpeg解码器上下文的thread_count = 4
(3)一个线程收包,一个线程解包。
当然这些办法都不能解决问题。
后来发现是给ffmpeg喂数据的方式不合适。
我给ffmpeg喂数据的方式简单粗暴
具体方式如下:
假设ptr为一帧完整H265,ptr_szie是ptr的大小
pkt->data = ptr;
pkt->size = ptr_szie;
avcodec_send_packet(m_pDecodeCtx,pkt);
avcodec_receive_frame(m_pDecodeCtx, frame);
解决办法:使用avio_alloc_context的回调函数read_packet
来给ffmpeg喂数据。
经过测试,不会出现Could not find ref with POCXX的问题。
经测试,延时160ms
AVIOContext *avio_alloc_context(
unsigned char *buffer,
int buffer_size,
int write_flag,
void *opaque,
int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),
int (*write_packet)(void *opaque, uint8_t *buf, int buf_size),
int64_t (*seek)(void *opaque, int64_t offset, int whence));
或者使用硬件编码也可以解决问题