我正在使用live555库接收RTSP流并使用ffmpeg对其进行解码。 起初,我无法解码来自live555的数据。经过一点点搜索后,我了解到在将帧发送到FFmpeg之前,我需要为帧数据包含序列(SPS)和图片参数集(PPS)。
标题:00 00 00 01 67 4d 00 14 95 b8 58 25 90 00 00 00 01 68 ee 3c 80 00 00 00 01
FFmpeg can't decode H264 stream/frame data
现在我可以采取框架,但一个小问题出来了。 [![在此处输入图像说明] [1]] [1]
3个包仍然有问题。 FFmpeg无法解码它们我建议它们是特殊命令。因为它们是如此之小9,4和5字节来。
他们在这里
[h264 @ 0x137c00]没有框架! 00 00 00 01 67 4d 00 14 95 b8 58 25 90 00 00 00 01 68 ee 3c 80 00 00 00 01 67 4d 00 14 95 b8 58 25 90 [h264 @ 0x137c00]没有框架! 00 00 00 01 67 4d 00 14 95 b8 58 25 90 00 00 00 01 68 ee 3c 80 00 00 00 01 68 ee 3c 80 [h264 @ 0x137c00]没有框架! 00 00 00 01 67 4d 00 14 95 b8 58 25 90 00 00 00 01 68 ee 3c 80 00 00 00 01 06 e5 01 ec 80 [h264 @ 0x137c00]没有框架!
有什么建议吗?
答案 0 :(得分:1)
以00 00 00 01 67开头的数据包是您的SPS,00 00 00 01 68是您的PPS。您可能希望使用h264 AVParser,它将PPS / SPS /帧组合成单个数据包,这就是ffh264解码器所期望的。典型的RTSP流(或任何网络流)将每隔几秒钟重复一次PPS / SPS。
答案 1 :(得分:0)
好的,我可能已经解决了问题。我在解码帧之前添加了解析操作。
avparser= av_parser_init(AV_CODEC_ID_H264);
len= av_parser_parse2(avparser,mCodecContext,&data,&lenght_parse,encodedFrame,encodedFrameSize,0,0,0);
while(encodedFrameSize)
{
len= av_parser_parse2(avparser,mCodecContext,&data,&lenght_parse,encodedFrame,encodedFrameSize,0,0,0);
encodedFrame += len;
encodedFrameSize -=len;
if(lenght_parse)
{
av_init_packet(&pkt);
pkt.data=data;
pkt.size=lenght_parse;
length = avcodec_decode_video2(mCodecContext,decodedFrame,&gotFrame,&pkt);
}
}
我昨天测试了应用程序并出现了一个新问题。应用程序在4-5小时后停止流式传输我认为问题是基于解码操作。现在我想解决这个问题。
日复一日,我正在接近解决方案!