之前对mp4文件进行解码,后来想到了从网络流接收数据之后暂存在内存中,从内存读取直接进行解码,原本以为没什么区别,但是真正测试发现了很多问题,如下面的代码
AVIOContext* pb = NULL;
const AVInputFormat* piFmt = NULL;
uint8_t* buf = (uint8_t*)av_mallocz(sizeof(uint8_t)* BUF_SIZE);
pb = avio_alloc_context(buf, BUF_SIZE, 0, NULL, read_data, NULL, NULL);
fmt_ctx = avformat_alloc_context();
fmt_ctx->pb = pb;
ret = avformat_open_input(&fmt_ctx, "", piFmt, NULL);
备注:int read_data(void *opaque, uint8_t *buf, int buf_size)
执行到avformat_open_input函数可能会一直卡住过不了,调试的时候是可以过去,但是不断点反而过不了,一直卡在read_data函数中,而且打印read_data的参数,发现 buf_size一直在减少,减少的数量为读到buf的数量,后来推迟执行时间,等网络流接收到足够的数据再继续往下执行,又出现了下面几个问题
h264 @ 0000025e8455c280] error while decoding MB 1 24, bytestream -22
[h264 @ 0000025e8455c280] concealing 288 DC, 288 AC, 288 MV errors in I frame
[h264 @ 0000025e8455c280] Invalid NAL unit size (0 > 2120).
[h264 @ 0000025e8455c280] Error splitting the input into NAL units.