C语言字符串处理提取时间(ffmpeg返回的时间字符串)
【1】需求
需求:有一个 “00:01:33.90” 这样格式的时间字符串,需要将这个字符串的时间值提取打印出来(提取时、分、秒、毫秒)。
这个时间字符串从哪里来的? 是ffmpeg返回的时间,也就是视频的总时间。

下面是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来提取匹配的结果。
相关文章:
C语言字符串处理提取时间(ffmpeg返回的时间字符串)
【1】需求 需求:有一个 “00:01:33.90” 这样格式的时间字符串,需要将这个字符串的时间值提取打印出来(提取时、分、秒、毫秒)。 这个时间字符串从哪里来的? 是ffmpeg返回的时间,也就是视频的总时间。 下…...
NC(65)元数据增加字段
以报销单主表er_bxzb表为例,增加15个字段字段以及两个其他业务所需字段 1、先在er_bxzb增加字段 增加字段 alter table er_bxzb add no_invoice char(1) default(N);alter table er_bxzb add is_enabled_taxation_cloud char(1) default(N);alter table er_bxzb a…...
SParC数据集介绍
导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次,大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…...
OpenGL 绘制Mesh数据(Qt)
文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…...
9.传统的轨道画线算法()
轨道画线分为以下步骤: 1.读取摄像头图片 2.图片灰度处理,截取轨道区域的图片 3.中值滤波处理,并区域取均值后做期望差的绝对值。本人通过一些轨道图片实验,用这种方法二值化得到的效果比caany算子等方法的效果好 4.二值化后再…...
F (1164) : B DS二叉排序树_有效的二叉排序树
Description 给你一个二叉树,判断其是否是一个有效的二叉排序树。 有效的二叉排序树定义如下: 1. 结点的左子树只包含小于当前结点的数。 2. 结点的右子树只包含大于当前结点的数。 3. 所有左子树和右子树自身必须也是二叉排序树。 Input 第一行输…...
结合el-upload修改支持上传图片、视频并预览
结合element plus的el-upload标签,实现上传图片和视频,并支持在线预览和放大 1、html部分 <el-form-item label"活动照片、视频"><el-uploadv-model:file-list"state.photoList":action"state.uploadUrl"accept…...
1.SQL - 概述
1. SQL语句分类 • 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等 • 数据操作语言:简称DML(Data …...
GaussDB数据库表创建行访问控制策略
目录 一、前言 二、GaussDB中的行访问控制 1、CREATE ROW LEVEL SECURITY POLICY语法 2、ALTER ROW LEVEL SECURITY POLICY语法 3、ROW LEVEL SECURITY策略与适配SQL语法关系 三、GaussDB中的行访问控制策略示例 1、实现GaussDB行访问控制的一般步骤 2、行访问控制策略…...
提升设备巡检效率的关键:易点易动设备管理系统的应用
随着互联网技术的发展,智慧设备管理已成为各行各业提升运营效率的重要选择。相比传统的手动巡检方式,采用设备管理系统可以实现物联网技术给企业带来更高效的运营方式。其中,易点易动作为一款成熟的设备管理系统,其广泛应用于提升设备巡检效率这一领域发挥了很好的作用。 采用易…...
【C++】STL 容器 - list 双向链表容器 ① ( 容器特点 | 容器操作时间复杂度 | 构造函数 )
文章目录 一、 list 双向链表容器简介1、容器特点2、容器操作时间复杂度3、遍历访问5、头文件 二、 list 双向链表容器 构造函数1、默认无参构造函数2、创建包含 n 个相同元素的 list 双向链表3、使用初始化列表构造 list 双向链表4、使用另外一个 list 容器 构造 list 双向链表…...
[C/C++]数据结构 希尔排序
🥦前言: 希尔排序也称 “缩小增量排序”,它也是一种插入类排序的方法,在学习希尔排序之前我们首先了解一下直接插入排序. 一: 🚩直接插入排序 1.1 🌟排序思路 直接插入排序的基本原理是将一条记录插入到已排好的有序表中&#x…...
SQL进阶:子查询
一般情况下,我们都是直接对表进行查询,但有时候,想要的数据可能通过一次select 获取不到,需要嵌套select,这样就形成了子查询。 子查询可以位于查询语句的任意位置,主要的注意点在于用于不同的位置,和不同的关键字一起使用时,需要注意返回的列的数量和行的数量。 位于…...
5、IDEA集成Git
IDEA集成Git 1. 配置Git忽略文件2. 定位Git程序3. 初始化本地库、添加暂存区、提交到本地库4. 切换版本5. 创建分支和切换分支6. 合并分支7. 解决冲突 1. 配置Git忽略文件 问题1:为什么要忽略他们? 与项目的实际功能无关,不参与服务器上部署…...
oracle数据库sqlplus登录卡顿
问题描述 新安装了一套oracle 11.2.0.1 版本的数据库服务器,出现了在服务器本地通过sqlplus / as sysdba登录的时候很快,但是通过监听登录的时候就非常的慢,卡顿,大概需要1分钟多的时间才能登进数据库。 之前安装了好几套oracle …...
【C#】Visual Studio 2022 远程调试配置教程
在某些特殊的情况下,开发机和调试机可能不是同一台设备,此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹,用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …...
LSTM的记忆能力实验
长短期记忆网络(Long Short-Term Memory Network,LSTM)是一种可以有效缓解长程依赖问题的循环神经网络.LSTM 的特点是引入了一个新的内部状态(Internal State) 和门控机制(Gating Mechanism)&am…...
Unity之ShaderGraph如何实现瓶装水效果
前言 有一个场景在做效果时,有一个水瓶放到桌子上的设定,但是模型只做了个水瓶,里面是空的,所以我就想办法,如何做出来瓶中装睡的效果,最好是能跟随瓶子有液体流动的效果。 如下图所示: 水面实现 水面效果 液体颜色设置 因为液体有边缘颜色和内里面颜色,所以要分开…...
【python与机器学习3】感知机和门电路:与门,或门,非门等
目录 1 电子和程序里的与门,非门,或门,与非门 ,或非门,异或门 1.1 基础电路 1.2 所有的电路情况 1.3 电路的符号 1.4 各种电路对应的实际电路图 2 各种具体的电路 2.1 与门(and gate) 2…...
关键字:extends关键字
在 Java 中,extends 是一个关键字,用于表示继承关系。当一个类使用 extends 关键字时,它表示该类是一个子类,并且继承了父类的属性和方法。 以下是 extends 关键字的解析: 语法: 描述: ChildC…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
