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

news2025/3/20 1:55:53

【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 developers
  built with gcc 9.2.1 (GCC) 20200122
  configuration: --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-libopenmpt
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'D:/123.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isom
    creation_time   : 2015-04-30T02:43:22.000000Z
  Duration: 00:01:33.90, start: 0.000000, bitrate: 715 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 88200 Hz, stereo, fltp, 127 kb/s (default)
    Metadata:
      creation_time   : 2015-04-30T02:43:22.000000Z
      handler_name    : GPAC ISO Audio Handler
    Stream #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.000000Z
      handler_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.coloradmin.cn/o/1335873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之Atomic 原子类总结

Java之Atomic 原子类总结 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思。在化学上&#xff0c;我们知道原子是构成一般物质的最小单位&#xff0c;在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一…

TypeScript学习(进阶篇)

一、元组 数组合并了相同类型的对象&#xff0c;而元组&#xff08;Tuple&#xff09;合并了不同类型的对象。 元组起源于函数编程语言&#xff08;如 F#&#xff09;&#xff0c;这些语言中会频繁使用元组。 简单的例子 定义一对值分别为 string 和 number 的元组&#xf…

计算机视觉基础(13)——深度估计

前言 本节是计算机视觉的最后一节&#xff0c;我们将学习深度估计。从深度的概念和度量入手&#xff0c;依次学习单目深度估计和双目/多目深度估计&#xff0c;需要知道深度估计的经典方法&#xff0c;掌握深度估计的评价标准&#xff0c;注意结合对极几何进行分析和思考。 一、…

成为小leader后,最大的感受就是:领导真的更偏爱主动汇报的下属!

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 有些朋友在职场&#xff0c;可能会陷入一个误区&#xff0c;觉得我们的付出&#xff0c;领导都能看到。这就大错特错了&#xff0c;很简单&#xff0c;打个比方&#xff0c;你有10…

申请虚拟VISA卡Pokepay 教程来了

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

网络安全法规和模型

基础 ISO信息安全&#xff1a;为数据处理系统建立和采取技术、管理的安全保护&#xff0c;保护计算机硬件、软件、数据不因偶然的或恶意的原因而受到破坏、更改、泄露 信息安全属性&#xff1a; CIA三元组&#xff1a;保密性、完整性、可用性 其他属性&#xff1a;真实性、不…

微短剧,会成为长视频的“救命稻草”吗?

职场社畜秒变霸道总裁&#xff0c;普通女孩穿越成为艳丽皇妃.......这样“狗血”的微短剧&#xff0c;最近不仅在国内各大视频平台上异常火爆&#xff0c;而且还直接火出了国外。 所谓微短剧&#xff0c;就是单集时长从几十秒到十几分钟的剧集&#xff0c;有着相对明确的主题和…

Android 手机对于Arduino蓝牙控制解决方案

1、Android系统概述 ​ Android 系统是 Google 公司基于 Linux 内核开发的移动端操作系统,适用于智能手机智能手表平板电脑等设备&#xff0c;最新的版本为 7.1。Android系统具有免费开源的优势,任何企业与个人都可以查阅公开的 API 文档&#xff0c;并在自己开发的应用中通过调…

【Gitlab】CICD流水线自动化部署教程

第一步&#xff0c;准备 GitLab 仓库 这个不用多说&#xff0c;得先保证你的项目已经托管在一个 GitLab 仓库中。 第二步&#xff0c;定义 .gitlab-ci.yml 文件 在你的项目根目录中创建一个 .gitlab-ci.yml 文件。这个文件将定义所有 CI/CD 的工作流程&#xff0c;包括构建、测…

IPC之十:使用共享文件进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;常用的 IPC 方式有管道、消息队列、共享内存等&#xff0c;但其实使用广大程序员都熟悉的文件也是可以完成 IPC 的&#xff0c;本文介绍如何使用共享文件实现进程间通信&#xff0c;本文给出了具体的实…

基于电商场景的高并发RocketMQ实战-Commitlog基于内存的高并发写入优化、基于JVM offheap的内存读写分离机制

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…

linux:下载、网络请求、端口

一&#xff1a;ping命令 可以通过ping命令,检查指定的网络服务器是否是可联通状态 语法: ping [-c num] ip或主机名 1、选项&#xff1a;-c,检查的次数&#xff0c;不使用-c选项&#xff0c;将无限次数持续检查 2、参数&#xff1a;ip或主机名&#xff0c;被检查的服务器的…

NET中使用SQLSugar操作sqlserver数据库

目录 一、SqlSugar是什么&#xff1f; 二、迁移和建表 1.建立实体 2.创建上下文类 3.在Program中添加SqlSugar服务 4.在控制器中注入上下文类 三、简单实现CURD功能 总结 一、SqlSugar是什么&#xff1f; SqlSugar是一款老牌 .NET 开源ORM框架。 主要特点&#xff1a…

天啦撸 超级麻烦的MySQL索引和数据引擎,快拿小本本记好

1 MySQL的索引 1.1 索引 定义&#xff1a; 索引是一个排序的列表&#xff0c;包含索引字段的值和其对应的行记录的数据所在的物理地址 ●索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过…

边缘计算AI智能盒子的视频源必须是固定点监控摄像头吗?

边缘计算AI盒子的视频输入源&#xff0c;要求是RTSP或者GB28181&#xff0c;可以是固定点监控摄像头&#xff08;枪机、球机等&#xff09;&#xff0c;也可以是移动摄像头&#xff0c;例如执法记录仪、智能安全帽、布控球等&#xff0c;但由于RTSP输入要求摄像头有固定IP&…

贪吃蛇小游戏的代码实现之知识点铺垫篇

今天给大家介绍一个很经典的小游戏&#xff0c;它和扫雷在经典小游戏这方面可以说是旗鼓相当&#xff0c;它的名字就是贪吃蛇。贪吃蛇游戏最初为单机模式&#xff0c;后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。该游戏具体玩法是&#xff1a;用游戏把子上下左右控…

redis复习笔记01(小滴课堂)

高并发的必备两大“核技术”队列和缓存 介绍本地缓存和分布式缓存 Nosql介绍和Reidis介绍 Linux服务器源码安装Redis6和相关依赖 在路径下上传压缩包。 上传压缩包。 版本更新了&#xff0c;但这是临时的。 版本更新了。 解压压缩包&#xff1a; 重命名&#xff1a; 我们可以看…

网页乱码问题(edge浏览器)

网页乱码问题&#xff08;edge&#xff09; 文章目录 网页乱码问题&#xff08;edge&#xff09;前言一、网页乱码问题1.是什么&#xff1a;&#xff08;描述&#xff09;2.解决方法&#xff1a;&#xff08;针对edge浏览器&#xff09;&#xff08;1&#xff09;下载charset插…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称&#xff0c;是用Java编写的是运行在 Web 服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;可以收集来自网页表单的用户输…

树莓派开箱安装

树莓派摄像头安装教程&#xff1a; 百度安全验证 树莓派5代9层亚克力外壳安装&#xff1a; 百度安全验证