最近遇到了些ffmpeg的错误,有些意想不到,有些也很低级,但很多遇到了很难排查到特此记录下。
1、avformat_new_stream 的 Function not implemented错误
打包放到实机的时候发现,无法开启录制,只要录制就报错Function not implemented
报错位置在写入的代码这里:
_videoStream = ffmpeg.avformat_new_stream(_formatContext, null);
这段代码的上下文逻辑很简单,先是构建了_formatContext 然后往这个上下文中添加videoStream,后面对这个流进行操作,结果却在avformat_new_stream时报了这个错误。
查找了很多博客、论坛帖子都没遇到解决的方式,什么ffmpeg版本不对啊,什么上下文共用了,跟我的代码都没关系。
最后一行行看代码,发现了是硬解码的时候,指定了固定的显卡类型,这里我指定的indel显卡进行编码,但是我实际测试的机器上只有n卡,才导致的这个错误。。。
2、硬件加速后存储的录像文件颜色变为灰色
这个现象是发现在rtsp流启用h265编码的情况下。
先是确认了解码帧的类型为nv12无误,这样所以我播放时是彩色没有问题的。
那么接下来就排查编码的格式,这里直接发现了问题
if (_hwDevice == AVHardwareType.AV_HWDEVICE_TYPE_QSV)
{_videoCodecContext->pix_fmt = AVPixelFormat.AV_PIX_FMT_NV12;
}
只是对QSV硬解的做了编码器NV12格式的指定,而编码器上下文_videoCodecContext的pix_fmt需要和解码器输出格式一致,同时和硬件加速格式一致,这时只要使用CUDA硬解时确保编码器上下文和解码帧的类型一样为NV12即可。正常来说需要对编码信息采集,来保持一致。