当前位置:   article > 正文

ffmpeg视频编码解码h264(c++)制作播放器,并推裸流使用在mediacodec的播放过程中,视频无法播放、崩溃等一些bug的解析_ffmpeg转出来的视频无法播放

ffmpeg转出来的视频无法播放

关于mediacodec的其它坑,详细可参考笔者往期博文,以下博文不推荐无音视频基础人士食用。

1.解码而言相对比较容易,但是有一点可能就是用find_decoder_by_name的api时,可能会找不到"libx264"的解码器,这可能是因为ffmpeg在编译时没有将x264的库编译进去,导致出现该问题,不妨去命令台看看是否有x264的编解码器,重新下载一个别人编译好的(小tips:这些资源和整个安装环境配置过程可去零声教育的QQ机构群里白嫖,但笔者并没有推荐去它们那边培训的意思)。

2.视频播放器这边笔者使用的是qt的播放界面,支持mp4.264,但暂未加上音频的播放,播放过程中可能遇到的问题:

(1)拖动UI上方的任务栏时,视频跟着一起卡住,建议播放另外开启一个线程解码,播放时再通过信号与槽的机制回馈给UI显示可以避免此类情况。

(2)视频不是一解码后就立即塞给UI播放,而是要相应的延时一段时间,因为虽然sps.pps提供时间戳,但控制视频播放解码后渲染还是要靠自己控制延时才能达到正常时间的播放效果。

(3)使用av_seek_frame出现花屏现象,这是因为没有定位到关键帧进行播放,P帧没有前面的I帧做参考(P帧I帧是什么自己查资料),因此出现花屏,但是调好标志位定位到关键帧时也会有问滚动条定位和时间显示的问题,这类问题建议滚动条正常显示,但切换I帧到滚动条正常位置的过程可以通过改动解码延时来变相切换达到掩人耳目的效果。

(4)解码播放占用CPU过高,可以考虑用openGL渲染占用GPU播放,可以有效降低内存使用。

3.视频编码推送给mediacodec解码过程遇到的问题:

(1)参数不一致的问题:要注意尤其是编解码器视频长宽的一致性,事实上如果解码器的视频分辨率比编码器的低不会有影响,但是如果相反就会导致mediacodec解码过程进入dequeueInputbuf崩溃,这是因为队列空间是由长宽决定的,长宽超过就塞不进去解码队列就崩了。

(2)编码器写本地264文件的问题:一定要小心如果ffmpeg是用fwrite来写本地h264文件时,如果写方法用“a+”,它会在视频码流给你每一个0a前面都自动多写一个0d十六进制位上去,最后导致264视频播放不了,在ffplay那边的警告提示(left)top block unavailable for requested intra mode -1,这种问题非常坑。

(3)qt在写h264码流时每一个关键帧的前面不会自动给你加sps.pps,导致视频不能播放,这个问题如果您的CODEC_ID确实指向H264,直接去编解码器上下文的extradata里面可以找到sps.pps而笔者需要输出成mp4同时推流,所以使用:

  1. AVBitStreamFilterContext* bsfc=av_bitstream_filter_init("h264_mp4toannexb");
  2. unsigned char* dummy=NULL;
  3. int len;
  4. av_bitstream_filter_filter(bsfc,videoEncodeCodecContext,
  5. NULL,&dummy,&len,NULL,0,0);

然后再写extradata就没问题了。

(4)qt在编码H264时是没有办法正常打印编码器在pkt.data里面的字符的(qDebug和cout都不行),使用调试也没有办法查到编码出来data包的地址信息,只有写到文件里才能看见,具体原因不明。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/392007
推荐阅读
相关标签
  

闽ICP备14008679号