小编bbe*_*ben的帖子

使用ffmpeg(libavcodec)通过RTP解码H264视频的问题

我使用SDP的profile-level-id et sprop-parameter-set设置AvCodecContext的profile_idc,level_idc,extradata和extradata_size.

我将Coded Slice,SPS,PPS和NAL_IDR_SLICE数据包的解码分开:

在里面:

uint8_t start_sequence [] = {0,0,1}; int size = recv(id_de_la_socket,(char*)rtpReceive,65535,0);

编码切片:

char *z = new char[size-16+sizeof(start_sequence)];
    memcpy(z,&start_sequence,sizeof(start_sequence));
    memcpy(z+sizeof(start_sequence),rtpReceive+16,size-16);
    ConsumedBytes = avcodec_decode_video(codecContext,pFrame,&GotPicture,(uint8_t*)z,size-16+sizeof(start_sequence));
    delete z;
Run Code Online (Sandbox Code Playgroud)

结果:ConsumedBytes> 0且GotPicture> 0(经常)

SPS和PPS:

相同的代码.结果:ConsumedBytes> 0且GotPicture = 0

我认为这是正常的

当我找到一对新的SPS/PPS时,我使用此数据包的有效负载及其大小更新extradata和extrada_size.

NAL_IDR_SLICE:

Nal单元类型是28 => idr帧被分段为此我尝试了两种方法来解码

1)我在第一个片段(没有RTP头)前加上序列0x000001,并将其发送到avcodec_decode_video.然后我将剩下的片段发送到这个函数.

2)我将第一个片段(没有RTP头)加上序列0x000001的前缀,并将其余的片段连接到它.我把这个缓冲区发送给解码器.

在这两种情况下,我都没有错误(ConsumedBytes> 0)但我没有检测到任何帧(GotPicture = 0)......

问题是什么 ?

c++ rtp h.264 libavcodec

9
推荐指数
1
解决办法
3万
查看次数

标签 统计

c++ ×1

h.264 ×1

libavcodec ×1

rtp ×1