这真是个难搞的东西,非常的郁闷,基本二分钟一个问题,哎,不知道是太菜了,还是这流媒体太难搞了,反正以后打死不想搞这个。碰到的问题一堆一堆的,先记录下碰到的问题吧,一步一步来:
1.error LNK2019:无法解析的外部符号,一看链接错误,感觉文件都添加了呀,仔细一看,使用了的函数只声明了,没有实现,加上,继续,还是有问题,找来找去,半天没头绪,对比了下没出错的文件,好像少了个extern "C",把这文件一加,好了,我勒个去,C/C++混编害死人啊,但是出现这个错误肯定是你工程没包含头文件,要么是函数没有定义,或者没有导入库,最后试试extern.
2.添加自己的视频捕捉类,需要添加库文件,common文件,sdk_dll文件,av2000SDK.dll到当前目录中,包含都不行,还要添加到工程中,我去。
3.如果出现error C2664: “LoadLibraryW”: 不能将参数 1 从“const char [14]”转换为“LPCWSTR”这样的错误,就是工程开户了多字符,在项目属性/配置属性/常规/项目默认值/字符集中修改成不使用Unicode。
4.编译ffmpeg之后,解码jpeg文件, 使用ffmpeg -i 1.jpg 1.yuv 转换之后生成了yuv420文件,但是用vlc打开老是花屏,我去,解决不了,没人教真困难,还以为是转码不正确,心已经死了,真心难搞,后来问了师兄后,说yuv420有它固定的存储方式, 需要用特定的工具打开才行,来希望了,马上找了个,果真图片出来了,终于走对了一步了,哎,但后面太漫长了,变成420后需要 把内存中的jpeg解码,然后在编码成264,最后利用live555转发出去,任何一步出现问题都不会出画面,今天就先记录到这,明天继续奋斗,实时更新。NND的。
今天挺高兴的,这二天碰到的难题都解决了,竟然是一个人找资料搞出来的,我都佩服我自己了,呵呵,先自己赞一个。
好了,把做流媒体近半个月来的过程和碰到的问题记录下来,自己弄真的很困难,我其实也是找了相关的群,问了的,要不然,肯定早做不下去了,主要还是坚持,这里鼓励下大家。
好了,接上次,在用ffmpeg把jpg的视频流解码后就要开始编码成264了,这里264编码需要编译libx264的库文件,编译过程中好像没有碰到什么困难,但它好像需要yuv420的,听人家说ffmpeg解码后出来的是422,然后我又花了一天的时间去找yuv422转420的,本来用ffmpeg的sws_scale就是用来转码的,但我的程序总运行到这就崩溃,我是参照的网上例子,实在找不出问题,又没人肯说和指导下,要放弃了,最后问的群里一哥们,是不是把数据源搞错了,你在去看看网上对数据源的说明,后来一看说明,YUV的要用到三个通道,而我参照的这例子只用到了一个通道,他的是RGB24,我的是YUV,后来改成这样:
/*ctx->pic_src.data[0] = (uint8_t *)pFrame->data[0]; ctx->pic_src.data[1] = (uint8_t *)pFrame->data[1]; ctx->pic_src.data[2] = (uint8_t *)pFrame->data[2]; ctx->pic_src.data[3] = 0; ctx->pic_src.linesize[0] = pFrame->linesize[0]; ctx->pic_src.linesize[1] = pFrame->linesize[1]; ctx->pic_src.linesize[2] = pFrame->linesize[2]; ctx->pic_src.linesize[3] = 0; int rs = sws_scale(ctx->sws, ctx->pic_src.data, ctx->pic_src.linesize,0, ctx->rows, ctx->pic_target.data, ctx->pic_target.linesize);
OK,好了,非常的兴奋。呵呵,解决了一个。
这下可以安心的去把图片编码成264的了,而且这个问题也一直是导致我调用264压缩函数x264_encoder_encode崩溃的原因,因为后面到这又崩溃了,有了前面的教训,我知道肯定又是数据传错了,肯定数据不是420的,然后返回去把数据一更改,也就通了。
这下全通了,但live555传这个画面还是黑的,而已运行一下之后又崩溃了,我勒个去,要疯了,没办法,还是要找错误,应该在264编码格式上有问题,因为总体下来大致的过程就是yuv420->264,然后live555发送264,我把YUV420写成文件是没问题的,所以问题就在264的编码上了。把264写到文件中,看了下,也是对的,我去,这回没得改了,不应该啊,照常的崩溃,心死了,然后就漫无目标的看着代码,忽然看到了一个数据释放的地方,我刚拿到yuv420的数据,然后就调用av_free(pFrame),把这一贞给释放掉了,感觉有点不对,然后就注释起来,一运行,我滴个天啊,竟然图像出来了,哭,心理那个滋味啊,不提多爽了,半个月来的成果,终于出来了,终于可以交货了,但是出现内存泄漏了,每秒1M的速度开始增加,但这也不算什么,只要能让总监看到成果,后面的问题可以慢慢来。呵呵。
写了这么多,总结下,里面太多的问题其实是不了解造成的,因为没那么多的时间去给我慢慢看,老在那催,不了解的话,就要细心的去编程了,然后先要把总体的大致结构列出来,碰到什么问题就解决什么问题,在现在这个年代,基本上什么问题都可以在网上找到答案.我的总体框架列出如下,大家可以参考下:
从IP摄像机获取一帧数据->用ffmpeg解码->用ffmpeg转换格式->用libx264编码成264格式->live555把数据发送出去。
这样基本上一个实时的摄像机监控就完成了,后面剩下的就是优化工作了,呵呵。
OK,文章就写到这了,文笔不好,随便写写,主要是大家多交流交流,不早了,下班闪人