使用FFmpeg在C语言中实现H264转JPEG/PNG编解码遇文件不可读问题求助
H264转JPEG/PNG文件无法读取的排查方案
首先明确:你选的编解码器没问题——AV_CODEC_ID_H264作为H264解码器、AV_CODEC_ID_MJPEG作为JPEG编码器是完全正确的组合,MJPEG本身就是生成标准JPEG文件的编码方式。文件读不了的问题大概率出在其他环节,下面是常见的排查点:
像素格式不匹配
H264解码输出通常是YUV格式(比如YUV420P),而MJPEG编码器可能要求特定的像素格式(比如YUVJ420P)。你需要确认解码帧的像素格式和编码器支持的格式是否一致,不一致的话必须用sws_scale做格式转换,否则编码出来的文件会损坏。编码器参数配置错误
- 图像宽高必须和解码后的帧完全一致,不能随便设置;
- MJPEG编码时,要正确设置质量参数(比如
qmin、qmax),参数不合理会导致文件无法解析; - 如果是转PNG,记得改用
AV_CODEC_ID_PNG编码器,PNG不需要帧率参数,且支持的像素格式以RGB/RGBA为主。
解码环节输出无效帧
如果H264是裸流(无封装),必须先给解码器传入正确的SPS/PPS参数,否则解码出来的帧是损坏的,后续编码自然生成无效文件。可以检查解码后帧的width、height是否符合预期,或者用av_frame_is_valid判断帧是否有效。文件写入不规范
编码得到的AVPacket数据要完整写入文件,不能截断或混入其他数据。写入前可以打印数据包的大小,或者用系统工具(比如file命令)查看生成的文件是否被识别为JPEG/PNG格式——如果工具识别不了,说明编码输出本身就不是合法的图像数据。
内容的提问来源于stack exchange,提问作者Vikram Kamath
相关产品推荐
相关产品推荐

