c++ 调用ffmpeg命令获取视频属性
时间:2022-07-26
本文章向大家介绍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; //码率
}
}
- [喵咪大数据]Hive2搭建和基本操作
- [喵咪大数据]Hadoop节点添加下线和磁盘扩容操作
- [喵咪大数据]Hadoop集群模式
- 【教程】使用TensorFlow对象检测接口标注数据集
- [喵咪大数据]Hadoop单机模式
- 【死磕Java并发】—–Java内存模型之happens-before
- 9个,程序员又爱又恨的编程习惯
- Dubbo 源码解析 —— Cluster
- 【死磕Java并发】—–Java内存模型之从JMM角度分析DCL
- 基于PhalApi2的Redis拓展
- [喵咪BELK实战(3)] logstash+filebeat搭建
- Dubbo源码解析 —— Router
- 【死磕Java并发】—–深入分析volatile的实现原理
- phalcon-入门篇3(优美的URL与Config)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你所不知道的printf函数
- c语言之——整型的隐式转换与溢出检测
- Istio 的配置分析
- (C99)复合字面量
- 排障集锦:九九八十一难之第十三难!-------------史上最全MySQL 单实例故障排查
- c语言数组越界的避免方法
- 单片机的存储区范例
- 大点干!早点散----------Nginx+Tomcat动静分离
- 大点干!早点散----------深入剖析缓存加速--squid传统代理和透明代理
- stm32 HardFault_Handler调试及问题查找方法——飞思卡尔
- 堆栈的分布
- memset()函数的使用
- 质量保障的方法和实践
- Selenium4 IDE,它终于来了
- strtol函数的用法——字符串转长整形