C语言字符串处理提取时间(ffmpeg返回的时间字符串)

【1】需求

需求:有一个 “00:01:33.90” 这样格式的时间字符串,需要将这个字符串的时间值提取打印出来(提取时、分、秒、毫秒)。

这个时间字符串从哪里来的? 是ffmpeg返回的时间,也就是视频的总时间。

image-20230815134021328

下面是ffmpeg获取视频总时间的输出。

C:\Users\11266>ffmpeg -i D:/123.mp4
ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developersbuilt with gcc 9.2.1 (GCC) 20200122configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmptlibavutil      56. 31.100 / 56. 31.100libavcodec     58. 54.100 / 58. 54.100libavformat    58. 29.100 / 58. 29.100libavdevice    58.  8.100 / 58.  8.100libavfilter     7. 57.100 /  7. 57.100libswscale      5.  5.100 /  5.  5.100libswresample   3.  5.100 /  3.  5.100libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:/123.mp4':Metadata:major_brand     : mp42minor_version   : 0compatible_brands: mp42isomcreation_time   : 2015-04-30T02:43:22.000000ZDuration: 00:01:33.90, start: 0.000000, bitrate: 715 kb/sStream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 88200 Hz, stereo, fltp, 127 kb/s (default)Metadata:creation_time   : 2015-04-30T02:43:22.000000Zhandler_name    : GPAC ISO Audio HandlerStream #0:1(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 582 kb/s, 15 fps, 25 tbr, 30k tbn, 20000k tbc (default)Metadata:creation_time   : 2015-04-30T02:43:23.000000Zhandler_name    : GPAC ISO Video Handler

这串数据里 Duration: 00:01:33.90, start: 0.000000, bitrate: 715 kb/s,我们要提取00:01:33.90这串时间字符串出来,这个时间字符串就是当前视频的总时间。

下面是时间字符串提取代码,C语言代码:

char TotalTime[100];//解析数据
char *p = strstr(utf8_str.data(), "Duration:");
if (p)
{int i = 0;p += 9;while (*p != '\0' && *p != NULL && *p != ','){if (i > 90)break; //防止越界TotalTime[i++] = *p++;}TotalTime[i++] = '\0';
}qDebug() << "TotalTime:" << TotalTime;

下面的2个例子介绍如何提取时、分、秒、毫秒的时间,打印出来。

【2】C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void extractTime(const char* time_str, int* hour, int* minute, int* second, int* msec) {char* token;char* str;char* saveptr;// 复制时间字符串到临时缓冲区str = strdup(time_str);// 分割字符串,以":"为分隔符token = strtok_s(str, ":", &saveptr);// 提取小时部分if (token != NULL) {*hour = atoi(token);} else {*hour = 0;}// 分割剩余部分,以":"为分隔符token = strtok_s(NULL, ":", &saveptr);// 提取分钟部分if (token != NULL) {*minute = atoi(token);} else {*minute = 0;}// 分割剩余部分,以"."为分隔符token = strtok_s(NULL, ".", &saveptr);// 提取秒部分if (token != NULL) {*second = atoi(token);} else {*second = 0;}// 提取毫秒部分token = strtok_s(NULL, "", &saveptr);if (token != NULL) {*msec = atoi(token);} else {*msec = 0;}// 释放临时缓冲区内存free(str);
}int main() {const char* time_str = "00:01:33.90";int hour, minute, second, msec;extractTime(time_str, &hour, &minute, &second, &msec);printf("hour: %d\n", hour);printf("minute: %d\n", minute);printf("second: %d\n", second);printf("millisecond: %d\n", msec);return 0;
}

在这段代码中,实现了一个名为extractTime的函数,将时间字符串作为输入,并通过指针参数返回小时、分钟、秒和毫秒的值。使用strtok_s函数以":“和”."为分隔符逐个提取时间字符串的各部分,并将其转换为整数值。

在使用strtok_s函数时,将剩余部分分隔的分隔符设为"",以便可以正确提取毫秒部分。

【3】Qt正则表达式提取

#include <QCoreApplication>
#include <QString>
#include <QRegularExpression>
#include <QDebug>void extractTime(const QString& timeStr, int* hour, int* minute, int* second, int* msec)
{QRegularExpression regex("(\\d+):(\\d+):(\\d+)\\.(\\d+)");QRegularExpressionMatch match = regex.match(timeStr);if (match.hasMatch()) {*hour = match.captured(1).toInt();*minute = match.captured(2).toInt();*second = match.captured(3).toInt();*msec = match.captured(4).toInt();} else {*hour = 0;*minute = 0;*second = 0;*msec = 0;}
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString timeStr = "00:01:33.90";int hour, minute, second, msec;extractTime(timeStr, &hour, &minute, &second, &msec);qDebug() << "hour:" << hour;qDebug() << "minute:" << minute;qDebug() << "second:" << second;qDebug() << "millisecond:" << msec;return a.exec();
}

在代码中,实现了一个名为extractTime的函数,接收一个时间字符串,通过指针参数返回小时、分钟、秒和毫秒的值。使用QRegularExpression来定义一个正则表达式模式,然后使用QRegularExpressionMatch来提取匹配的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/300365.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMMI-项目总体计划模版

目录 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章 运维计划 1、总体目录结构 2、重点章节概要示例 2.1 第四章 项目管理 2.2 第六章 实施与交付计划 2.3 第七章运维计划

Mybatis如何兼容各类日志?

文章目录 适配器模式日志模块代理模式1、静态代理模式2、JDK动态代理 JDBC Logger总结 Apache Commons Logging、Log4j、Log4j2、java.util.logging 等是 Java 开发中常用的几款日志框架&#xff0c;这些日志框架来源于不同的开源组织&#xff0c;给用户暴露的接口也有很多不同…

网络安全保障领域

计算机与信息系统安全---最主要领域 云计算安全 IaaS、PasS、SaaS(裸机&#xff0c;装好软件的电脑&#xff0c;装好应用的电脑) 存在风险&#xff1a;开源工具、优先访问权、管理权限、数据处、数据隔离、数据恢复、调查支持、长期发展风险 云计算安全关键技术&#xff1a;可信…

(C++)DS哈希查找—二次探测再散列(附思路和详细注释)

Description 定义哈希函数为H(key) key%11。输入表长&#xff08;大于、等于11&#xff09;&#xff0c;输入关键字集合&#xff0c;用二次探测再散列构建哈希表&#xff0c;并查找给定关键字。 Input 测试数据组数 1≤&#xfffd;≤50. 每组测试数据格式如下&#xff1a…

【LeetCode刷题笔记】动态规划(四)

背包问题 0-1 背包问题 有一个背包,它的容量为 C现在有 n 种不同的物品,他们的编号分别是 0...n-1。每一种物品只有一个。在这 n 种物品中,第 i 个物品的重量是 w[i],它的价值为 v[i]问题是:可以向这个背包中放哪些物品,使得在不超过背包容量的基础上,背包中物品的总价…

Linux之用户/组 管理

关机&重启命令 shutdown -h now立刻进行关机shutdown -h 11分钟后关机&#xff08;shutdown默认等于shutdown -h 1) -h即halt shutdown -r now现在重新启动计算机 -r即reboot halt关机reboot重新启动计算机sync把内存数据同步到磁盘 再进行shutdown/reboot/halt命令在执行…

List那些坑

很多文章都介绍过这些坑&#xff0c;本文做个记录&#xff0c;并提供解决方案。 1.Arrays.asList的坑 1.1现象 情况1&#xff1a;通过Arrays.asList方法生成的List数据不支持添加操作 使用Arrays.asList方法生成的List数据&#xff0c;不能对其进行删除或者添加操作。代码示例…

申请虚拟VISA卡Pokepay 教程来了

官网地址https://www.pokepay.cc/ ​​​​​ 填写邮箱地址 填写邀请码116780 会有20USD开卡优惠券 限时几天活动

Arduino/Android 蓝牙通信系统设计解决方案

随着当今安全管理的发展需求以及国家对安全监控行业的支持&#xff0c;这几年&#xff0c;安全监控行业发展迅猛&#xff0c;各类监控系统百花齐放。传统的温度监控系统通过有线或其他方式传送温度数据&#xff0c;而本文提出了利用蓝牙无线传输数据的设计方案&#xff0c;这种…

7_js_dom编程入门1

Objective&#xff08;本课目标&#xff09; 掌握获取页面元素的常用方法 掌握事件触发案例 能够区分innerText和innerHTML的区别 综合案例训练 1 DOM 介绍 1.1 什么是DOM 文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;&#xff0c;是 …

单集群400TB,OceanBase稳定支撑快手核心业务场景

一款日均超过千万人访问的短视频 App 快手&#xff0c;面对高并发流量如何及时有效地处理用户请求&#xff1f;通过在后端配置多套 MySQL 集群来支撑高流量访问&#xff0c;以解决大数据量存储和性能问题&#xff0c;这种传统的 MySQL 分库分表方案有何问题&#xff1f;快手对分…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…