Golang获取音视频时长信息

文章目录

  • 一、工具简介
  • 二、使用golang获取时间长

一、工具简介

这些工具都是与多媒体处理和流媒体相关的开源工具,它们都属于 FFmpeg 多媒体框架。

  • FFmpeg

是一个用于处理多媒体内容(音频、视频、图像等)的命令行工具。它可以执行各种各样的操作,包括转码、剪辑、合并、分离、编码、解码等。FFmpeg 是一个功能强大且广泛使用的工具,可以在多种平台上运行。

  • FFplay

是 FFmpeg 提供的一个简单的媒体播放器,它可以播放各种格式的音频和视频文件。FFplay 是基于 FFmpeg 库构建的,它提供了一个轻量级的命令行界面,可用于快速播放多媒体文件,适用于测试和简单的播放任务。

  • FFprobe

是一个用于分析多媒体文件的工具。它提供了详细的信息,包括多媒体文件的编解码器、格式、流信息等。FFprobe 可以帮助用户了解多媒体文件的特性,例如分辨率、帧率、比特率等,这对于诊断和处理多媒体文件非常有用。

  • FFserver

是一个流媒体服务器,可以用于实时转码和分发音频/视频流。它可以接受来自各种来源(如摄像头、音频接口等)的多媒体流,并将其转码为不同的格式和分辨率,然后通过网络分发给客户端。FFserver 可以用于构建自己的流媒体平台,例如音视频直播服务或视频点播服务。

二、使用golang获取时间长

package mainimport ("bufio""fmt""os/exec""strconv"
)// getDuration 通过调用 ffprobe 来获取音视频文件的时长// 函数接收一个字符串参数 filePath,表示音视频文件的路径。
// 函数返回两个值:一个整数表示时长(秒),一个 error 表示可能发生的错误。
func getDuration(filePath string) (int, error) {// 使用 exec.Command 创建一个新的命令,调用 ffprobe 并带上一系列参数来指示它只输出文件的时长。cmd := exec.Command("/Users/lijie/workspace/ffmpeg-lijie/ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filePath)//通过 StdoutPipe 方法获取命令的标准输出流,以便我们可以读取 ffprobe 的输出。stdout, err := cmd.StdoutPipe()//如果在获取输出流时发生错误,则返回错误。if err != nil {return 0, err}//启动 ffprobe 命令。如果启动失败,则返回错误。if err := cmd.Start(); err != nil {return 0, err}//创建一个新的 bufio.Scanner 来读取 ffprobe 的标准输出。scanner := bufio.NewScanner(stdout)//使用 Scan 方法读取输出的第一行(即文件的时长)。if scanner.Scan() {//scanner.Text() 获取读取到的字符串。durationStr := scanner.Text()//使用 strconv.ParseFloat 将时长字符串转换为浮点数。duration, err := strconv.ParseFloat(durationStr, 64)//如果转换失败,则返回错误。if err != nil {return 0, err}//将浮点数时长转换为整数(秒),并返回,没有错误。return int(duration), nil}return 0, fmt.Errorf("no duration found")}// formatDurationSeconds 函数将秒数转换为分秒格式的字符串。
// 函数接收一个整数参数 seconds,表示时长(秒)。
// 函数返回一个字符串,表示时分秒格式的时长。
func formatDurationSeconds(seconds int) string {//计算时钟数,通过将总秒数除以3600。hours := seconds / 3600//计算分钟数,通过将总秒数除以60。minutes := (seconds % 3600) / 60//计算剩余的秒数,通过取总秒数除以60的余数。seconds = seconds % 60//根据秒数自动判断是否包含小时,并相应地格式化输出if hours > 0 {//根据秒数自动判断是否包含分钟,并相应地格式化输出if minutes > 0 {//使用 fmt.Sprintf 格式化分钟和秒数为 "MM:SS" 格式的字符串,并确保分钟和秒数都是两位数(不足两位时前面补0)。return fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)} else {return fmt.Sprintf("%02d:%02d", hours, seconds)}} else if minutes > 0 {return fmt.Sprintf("%02d:%02d", minutes, seconds)} else {return fmt.Sprintf("00:%02d", seconds)}}
func main() {//定义音视频文件的路径,并替换为实际的文件路径。filePath := "/opt/www/nginx/html/pages/resource/input.mp3"//调用 getDuration 函数获取文件的时长(秒)。durationSeconds, err := getDuration(filePath)//如果在获取时长时发生错误,则打印错误并退出程序。if err != nil {fmt.Println("Error getting duration:", err)return}fmt.Println("Duration:", durationSeconds)//调用 formatDurationSeconds 函数将时长(秒)转换为时分秒格式的字符串。durationFormatted := formatDurationSeconds(durationSeconds)fmt.Printf("Duration: %s\n", durationFormatted)
}

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

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

相关文章

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生,为了更好的使校园考研有一个更好的环境好好的学习,建议一个好的校园网站,是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…

【boost_search搜索引擎】2.正排索引和倒排索引

首先,要制作搜索引擎,我们首先要了解,什么是正排索引,什么是倒排索引,这是一个搜索引擎的关键。 1.正排索引 正排索引,其实就是我们的每一个文档,对应一个文档id。 正如vector容器一样&#xf…

【Docker】常用命令 docker info

文章目录 什么是docker info命令基本用法实际示例查看Docker系统信息 输出格式常用选项--format:自定义输出格式-f, --format:指定输出模板文件 总结 在Docker中, docker info命令是用于查看Docker系统信息的主要命令之一。本文将深入探讨 …

计算机视觉研究方向

计算机视觉是一个广泛且快速发展的领域,涵盖了多种研究方向和技术。主要的研究方向包括图像处理、目标检测与识别、图像生成、三维视觉、行为识别、深度学习与计算机视觉、多媒体分析、视频理解、风格化、全向视觉传感器等。这些研究方向和技术不断进步,…

Python+django+vue开发的家教信息管理系统

一直想做一款管理系统,看了很多优秀的开源项目但是发现没有合适的。 于是利用空闲休息时间开始自己写了一套管理系统。 功能介绍 平台采用B/S结构,后端采用主流的Pythondjango进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和…

go实现TCP服务器

package main import ( "fmt" "net" ) func main() { // 监听TCP端口 listener, err : net.Listen("tcp", "localhost:50000") if err ! nil { fmt.Println("Error listening:", err.Error…

Arduino智能家居

文章目录 一、接线框图1、下载fritzing 二、Arduino IDE 下载三、实现代码 一、接线框图 1、下载fritzing https://github.com/fritzing/fritzing-app/releases打开的软件界面如下: 二、Arduino IDE 下载 官网地址 P.S. 如果upload代码过程中出现cant open de…

2024年阿里云轻量应用服务器优惠价格_2核2G_2核4G报价

阿里云轻量应用服务器2核2G和2核4G配置优惠价格表,轻量2核2G3M带宽61元一年,轻量2核4G4M带宽165元1年,均不限制月流量,阿里云活动链接 aliyunfuwuqi.com/go/aliyun 活动打开如下图: 阿里云轻量应用服务器价格 61元/年…

力扣刷题之21.合并两个有序链表

仅做学习笔记之用。 题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入&#xf…

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言,使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

自定义android音频焦点

接着上一篇音频策略的分析,接下来看下音频焦点 音频焦点机制是Android系统提供的一种约定: 1 播放声音前申请音频焦点,播放结束的时候释放音频焦点, 2 获得焦点才能开始播放,失去音频焦点应该暂停播放或者降低音量 一…

使用Django实现信号与消息通知系统【第154篇—Django】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中,实现消息通知系统是至关重…

华为数通 HCIP-Datacom H12-831 题库补充

2024年 HCIP-Datacom(H12-831)最新题库,完整题库请扫描上方二维码,持续更新。 缺省情况下,PIM报文的IP协议号是以下哪一项? A:18 B:59 C:103 D:9 答案&a…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

【jvm】young gc full gc

何时触发YoungGC或FullGC YoungGC的触发时常在发生&#xff0c;当新生代的Eden区满了之后就会触发YoungGC。 FullGC在多个情况下都会被触发&#xff1a; 1、发生Young GC之前进行检查&#xff0c;如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象…

ubuntu20.04安装 ffmpeg 开发环境

参考&#xff1a;参考1 一些相关软件包&#xff0c;已打包整理好&#xff0c;如下 源码包 1、安装步骤 创建安装目录 sudo mkdir -p /usr/local/ffmpeg/lib 解压源码 tar -jxf ffmpeg-4.3.2.tar.bz2 到指定ffmpeg目录进行配置 cd ffmpeg-4.3.2/ 配置&#xff1a;会报错很多…

实现分页查询的一种方法,使用Microsoft SQL Server数据库

实现分页查询的一种方法,使用Microsoft SQL Server数据库 一、SQL语言用于分页的语句二、后端过程设计示例三、前端实现逻辑总结 各数据库均提供了分页查询的语句和相应的方法&#xff0c;但是如果查询的结果较为复杂&#xff0c;如查询结果需要结过再计算、分段、添加汇总行等…

Zookeeper(八)序列化与协议

目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网&#xff1a;Apache ZooKeeper 一 序列化与反序列化 …

Spark RDD 基本操作

Spark RDD 基本操作 在前面已经介绍过Spark RDD的两种操作分别是&#xff1a; Transformation&#xff08;转换操作&#xff09; Action&#xff08;行动操作&#xff09; 下面以例子的方式详细介绍Spark RDD的这两种操作涉及的函数。 Transformation&#xff08;转换操作&…