专栏首页技术的专栏c++ 调用ffmpeg命令获取视频属性
原创

c++ 调用ffmpeg命令获取视频属性

    string command = "ffmpeg -i D:\\vc\\images\\tanned_part_3600.mp4";
    FILE* pPipe = _popen(command.c_str(), "rt");
    if (!pPipe) {
        return "popen failed!";
    }
    char* buffer = new char[1024];
    char* info = new char[10000]{ 0 };
    uint32_t bytesRead, readCount=0;
    
	while (true) {
		bytesRead = fread(buffer, 1, 1024, pPipe);
		if (bytesRead == 0) {
			break;
		}
		memcpy(info + readCount, buffer, bytesRead);
		readCount += bytesRead;
    }
    
    //readCount 0,就是读取不到

单独执行上面command

$ ffmpeg -i D:\\vc\\images\\tanned_part_3600.mp4
ffmpeg version 4.3.1-full_build-www.gyan.dev Copyright (c) 2000-2020 the FFmpeg developers
            。。。。。
      handler_name    : VideoHandler
At least one output file must be specified

报错了,难道是错误的原因?

那么换一个没有错误的命令:

ffmpeg -i D:\\vc\\images\\tanned_part_3600.mp4 -ss 00:00:00 -vframes 1 -y  aaa.jpg

还是不行。。。

难道是打印日志级别的原因?

ffmpeg -loglevel info -i tanned_part_3600.mp4

还是不行

上述popen只是读取stdout的输出,,stderr是读取不到的,,猜测上面信息是打印到是stderr的了,搜了一下有种办法是建3个pipe可以间接取到stderr信息,不方便。

linux里有个stderr重定向的功能 2>&1 不妨一试,虽然是windows平台。

ffmpeg -i D:\\vc\\images\\tanned_part_3600.mp4 2>&1

竟然可以了。

然后通过正则获取比如,码率:

    std::regex bitrate_reg(".*bitrate: (\\d+) kb.*");
    std::smatch matchResult;
    string inputstr, inputstr2;
    inputstr = string(info);
    inputstr2 = inputstr.substr(0, readCount);
    
    if (std::regex_search(inputstr2, matchResult, bitrate_reg))
    {
        for (size_t i = 1; i < matchResult.size(); ++i)
        {
            cout << matchResult[i] << endl;   //码率
        }
    }

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vue style 绑定问题

    shirishiyue
  • win10_opencv4.2_cuda11_vs2019 编译

    查看cuda11支持的vs版本:https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-w...

    shirishiyue
  • WebPagetest:新手一眼看懂使用教程

    这是一个非常详细且专业的web页面性能分析工具,而且开源的!如果你打不开其官网,或者担心安全问题,你可以自己拿源码搭建这个平台工具。

    shirishiyue
  • 2020 FFmpeg 滤镜详解

    在多媒体处理中,术语滤镜(filter)指的是修改未编码的原始音视频数据帧的一种软件工具。

    jerrypxiao
  • HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)

    HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数...

    张果
  • 用Python转换一些常见全角字符为半

    最近在爬日文小说的过程中,经常遇到全角(甚至和和半角混用),造成我(强迫症)强烈不适,就着手专门写一个脚本处理之

    py3study
  • FFmpeg中overlay滤镜用法-水印及画中画

    overlay技术又称视频叠加技术。overlay视频技术使用非常广泛,常见的例子有,电视屏幕右上角显示的电视台台标,以及画中画功能,画中画是指在一个大的视频播...

    用户4940323
  • 高速上云/网络穿透/视频上云网关EasyNTS组网服务平台如何通过复制穿透结果实现外网到内网的访问?

    EasyNTS是网络穿透组网设备,由于外网不能直接访问内网,所以如果EasyNTS穿透的是内网下服务web端口,可以直接把穿透结果复制粘贴到网页,将内网ip和端...

    EasyNVR
  • Python 小知识点(9)--反射

    1.hasattr(obj,name_str) , 判断一个对象obj里是否有对应的name_str字符串的方法

    wfaceboss
  • C++版 - Leetcode 8: String to Integer (myAtoi,C库函数atoi模拟) (剑指offer 面试题49) 解题报告

    提交网址: https://leetcode.com/problems/string-to-integer-atoi/

    Enjoy233

扫码关注云+社区

领取腾讯云代金券