You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
原因分析
  1. FFmpeg解码兼容性问题:错误信息来自OpenCV底层依赖的FFmpeg库。wrong sample count表示视频的音视频样本计数异常,可能是文件封装格式损坏、编码不规范;co located POCs unavailable是H.264解码错误,说明帧的参考帧信息缺失或错误,导致FFmpeg无法正常解码。
  2. 代码逻辑错误:原代码中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()释放资源

二、处理视频文件兼容性问题

  1. 重新封装/转码视频:用FFmpeg命令行修复异常视频,统一编码格式:
    ffmpeg -i "demo (i).mp4" -c:v libx264 -c:a aac -movflags +faststart "fixed_demo (i).mp4"
    
    该命令会将视频重新编码为标准H.264+AAC格式,修复原文件的封装或编码异常。
  2. 升级FFmpeg版本:当前使用的FFmpeg 4.4.1版本较旧,升级到最新稳定版(如6.x系列)可修复部分解码兼容性问题,通过vcpkg更新:
    vcpkg upgrade ffmpeg:x64-windows
    

三、调试排查

  • 单独测试单个视频:挑出报错的视频单独读取,确认是特定文件问题还是批量文件的共性问题
  • 检查文件完整性:用MediaInfo等工具查看视频编码信息,确认文件是否损坏

内容的提问来源于stack exchange,提问作者Object Unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:15:40