ffmpeg解码h264,解成功了,但解出来的数据不正常

春天到了冬天还远吗 2013-02-21 10:05:25
解的网络流,把流保存到文件,ffplay能正常播放

初始化
	avcodec_register_all();

g_pCodec = avcodec_find_decoder(AV_CODEC_ID_H264);

if (g_pCodec==NULL)
{
MSG("avcodec_find_decoder");
return false;
}

g_pAvctx = avcodec_alloc_context3(g_pCodec);
if (g_pAvctx==NULL)
{
MSG("avcodec_alloc_context");
return false;
}


if (avcodec_open2(g_pAvctx, g_pCodec, NULL)<0)
{
MSG("avcodec_open");
return false;
}


解码数据



void InputData2(void* pData, int nDataLength)
{


AVPacket packet;
av_init_packet(&packet);
packet.data = (uint8_t*)pData;
packet.size = nDataLength;
int nLen;
int frameFinished = nDataLength;
//avcodec_get_frame_defaults(g_pSrcFrame);
nLen = avcodec_decode_video2(g_pAvctx, g_pSrcFrame, &frameFinished, &packet);
}

nLen小于0, frameFinished大于0,g_pSrcFrame里的高宽信息都正常,就是g_pSrcFrame->data里的数据不正常
g_pSrcFrame->data[0] g_pSrcFrame->data[1]
g_pSrcFrame->data[2] 里的数据都是这个
€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
...全文
1300 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueCheney1990 2015-01-06
  • 打赏
  • 举报
回复
我这儿可以正确解码,但是会少帧,300帧的视频,解出来只有200多帧,并且每次少的帧数都不一样,不知道是怎么回事?
  • 打赏
  • 举报
回复
答案呢???
u010421898 2014-09-16
  • 打赏
  • 举报
回复
楼主。我也遇到这个问题了 。不过 打算试试 av_parser_parse函数,总算是有个方法了
Manu_gino 2014-05-30
  • 打赏
  • 举报
回复
请问楼主这个问题解决了吗?现在遇到同样的问题,犯愁中…
geicuili 2013-12-22
  • 打赏
  • 举报
回复
引用 2 楼 wtx_sonery 的回复:
[quote=引用 1 楼 SoftSoftSoft2008 的回复:]

nGet = avcodec_decode_video(pDCodecCtx, pDPicture, &frameFinished, szImage, nImageLen);
这个函数试试

你好,没有avcodec_decode_video这个函数,只有avcodec_decode_video2[/quote]


一样的。现在解决了么?
xyl145988 2013-11-14
  • 打赏
  • 举报
回复
我用ffmpeg解码时也出现了楼主所说的问题,出来的数据也是€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ 请问解决了么?出现这个的原因是什么?我的也是一桢一桢解的。只是我的sps和pps包是后来插入到源码流的I桢前面。
  • 打赏
  • 举报
回复
引用 12 楼 wlxj8284 的回复:
你你好请问所用的FFMPeg是什么版本的,哪里有下载的?
http://ffmpeg.org/ http://ffmpeg.zeranoe.com/builds/
wlxj8284 2013-09-29
  • 打赏
  • 举报
回复
你你好请问所用的FFMPeg是什么版本的,哪里有下载的?
JGF_NTU 2013-03-03
  • 打赏
  • 举报
回复
楼主,看你的描述,你调用ffmpeg解码,返回的nLen小于0,应该是送给解码器的数据不够一帧,才返回一个负值的吧,建议你用Elecard stream eye的工具,这个可以查看h264的字段语义,也可以显示出每一帧图片,分析h264等编码的利器,地址是 http://download.tech.qq.com/soft/62/64/25560/
  • 打赏
  • 举报
回复
引用 5 楼 xjt 的回复:
我也遇到同样的问题,是接收的传输包需要在解码前重新组帧,因为data中的数据不全,不到一帧,所以...
我收到的数据是组好的。。。
  • 打赏
  • 举报
回复
	m_parser = av_parser_init(CODEC_ID_H264); 
  • 打赏
  • 举报
回复

void InputData(void* pData, int nDataLength)
{
	int pos=0;
	int64_t pts=AV_NOPTS_VALUE;
	int64_t dts=AV_NOPTS_VALUE;
	do 
	{
		uint8_t *pout;
		int pout_len;
		int len= av_parser_parse2(m_parser,g_pAvctx,&pout,&pout_len, ((const uint8_t*)pData)+pos,
			nDataLength-pos,pts,dts,AV_NOPTS_VALUE);

		pos +=len;

		if(pout_len >0 )
		{
			InputData2(pout,pout_len);

		}
	} while (pos<nDataLength);
}


我用了av_parser_parse2也不行。。。。。。。。
ZSHA1234 2013-02-28
  • 打赏
  • 举报
回复
遇到同样的问题,请问解决了吗?
freelancer_ex 2013-02-26
  • 打赏
  • 举报
回复
这里需要用到av_parser_parse,不同的ffmpeg版本后面可能带数字。
xjt 2013-02-26
  • 打赏
  • 举报
回复
我也遇到同样的问题,是接收的传输包需要在解码前重新组帧,因为data中的数据不全,不到一帧,所以...
SoftSoftSoft2008 2013-02-22
  • 打赏
  • 举报
回复
有这个函数吧,可能你用很新的ffmpeg ,新版本可能把这个函数干掉了。 ------------------------------------------------------- 签 名: ︻$▅▆▇◤ 昵 称: SoftSoftSoft2008 QQ : 79941308
  • 打赏
  • 举报
回复
刚换了个文件,解出来的是 同一个文件用其他软件解出来是这样的
SoftSoftSoft2008 2013-02-21
  • 打赏
  • 举报
回复
用 nGet = avcodec_decode_video(pDCodecCtx, pDPicture, &frameFinished, szImage, nImageLen); 这个函数试试
  • 打赏
  • 举报
回复
引用 1 楼 SoftSoftSoft2008 的回复:
用 nGet = avcodec_decode_video(pDCodecCtx, pDPicture, &frameFinished, szImage, nImageLen); 这个函数试试
你好,没有avcodec_decode_video这个函数,只有avcodec_decode_video2

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧