使用OpenCV读取MP4出现wrong sample count错误的原因及解决问询
问题
使用OpenCV合并多个MP4视频时,调用cv::VideoCapture读取视频时控制台输出大量错误:
[mov,mp4,m4a,3gp,3g2,mj2 @ 000001EB96084B80] wrong sample count [h264 @ 000001EB9AAE9D80] co located POCs unavailable
程序随后以退出值0直接退出,需要了解错误原因及解决办法。
演示代码
#include <string> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/video/video.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/videoio/videoio.hpp> #include <opencv2/highgui/highgui.hpp> int main() { cv::Mat frame; cv::VideoCapture vcap; for (int i = 1; i <= 60; i++) { if (!vcap.open("G:\\Users\\15819\\Desktop\\Demo\\demo (" + std::to_string(i) + ").mp4")) { std::cout << "Failed to Open File: demo (" << i << ").mp4" << std::endl; continue; } while (!vcap.read(frame)) cv::imshow("video", frame); } return 0; }
环境信息
- 通过vcpkg安装的库版本:
ffmpeg:x64-windows 4.4.1#21 a library to decode, encode, transcode, mux, dem... ffmpeg:x86-windows 4.4.1#21 a library to decode, encode, transcode, mux, dem... ffmpeg[avcodec]:x64-windows Build the avcodec library ...(其余库信息省略) opencv4:x64-windows 4.6.0#6 computer vision library opencv:x64-windows 4.6.0 Computer vision library ...(其余库信息省略)
- 系统:Windows 11 x64 Professional Workstation
- IDE:Visual Studio 2022
- C标准:C14
- 项目平台:x64 Release
原因分析
- FFmpeg解码兼容性问题:错误信息来自OpenCV底层依赖的FFmpeg库。
wrong sample count表示视频的音视频样本计数异常,可能是文件封装格式损坏、编码不规范;co located POCs unavailable是H.264解码错误,说明帧的参考帧信息缺失或错误,导致FFmpeg无法正常解码。 - 代码逻辑错误:原代码中
while (!vcap.read(frame))的条件写反了——vcap.read(frame)成功读取时返回true,失败返回false,当前逻辑仅在读取失败时调用imshow,会导致读取成功时直接退出循环;若第一帧读取失败,未初始化的frame被传入imshow,会触发未定义行为,甚至导致程序直接退出。
解决方法
一、修复代码逻辑错误
修正循环条件,确保读取成功时处理帧,同时添加窗口刷新逻辑:
#include <string> #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/video/video.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/videoio/videoio.hpp> #include <opencv2/highgui/highgui.hpp> int main() { cv::Mat frame; cv::VideoCapture vcap; for (int i = 1; i <= 60; i++) { std::string filePath = "G:\\Users\\15819\\Desktop\\Demo\\demo (" + std::to_string(i) + ").mp4"; if (!vcap.open(filePath)) { std::cout << "Failed to Open File: " << filePath << std::endl; continue; } // 修正循环条件:读取成功时进入循环处理帧 while (vcap.read(frame)) { cv::imshow("video", frame); // 添加waitKey刷新窗口,同时支持按键退出当前视频 if (cv::waitKey(25) >= 0) break; } // 释放当前视频资源,避免干扰下一个视频的读取 vcap.release(); } cv::destroyAllWindows(); return 0; }
关键修改点:
- 循环条件改为
while (vcap.read(frame)),确保读取到有效帧时才执行显示逻辑 - 添加
cv::waitKey(25),保证窗口正常刷新,同时支持按键中断 - 每个视频处理完成后调用
vcap.release()释放资源
二、处理视频文件兼容性问题
- 重新封装/转码视频:用FFmpeg命令行修复异常视频,统一编码格式:
该命令会将视频重新编码为标准H.264+AAC格式,修复原文件的封装或编码异常。ffmpeg -i "demo (i).mp4" -c:v libx264 -c:a aac -movflags +faststart "fixed_demo (i).mp4" - 升级FFmpeg版本:当前使用的FFmpeg 4.4.1版本较旧,升级到最新稳定版(如6.x系列)可修复部分解码兼容性问题,通过vcpkg更新:
vcpkg upgrade ffmpeg:x64-windows
三、调试排查
- 单独测试单个视频:挑出报错的视频单独读取,确认是特定文件问题还是批量文件的共性问题
- 检查文件完整性:用MediaInfo等工具查看视频编码信息,确认文件是否损坏
内容的提问来源于stack exchange,提问作者Object Unknown
相关产品推荐
相关产品推荐

