使用Golang获取音视频时长信息的示例代码

 更新时间:2024年03月25日 11:24:28   作者:杰哥的技术杂货铺  
这篇文章主要介绍了如何使用Golang获取音视频时长信息,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一、工具简介

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

  • FFmpeg

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

  • FFplay

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

  • FFprobe

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

  • FFserver

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

二、使用golang获取时间长

package main

import (
	"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)
}

到此这篇关于使用Golang获取音视频时长信息的示例代码的文章就介绍到这了,更多相关Golang获取时间长内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang并发之RWMutex的用法详解

    Golang并发之RWMutex的用法详解

    在 Go 语言中,RWMutex 是一种读写互斥锁的实现,它提供了一种简单有效的方式来管理对共享资源的并发访问。本文就来和大家详细聊聊RWMutex的用法吧
    2023-04-04
  • Go语言为什么不支持三元运算符原理解析

    Go语言为什么不支持三元运算符原理解析

    这篇文章主要为大家介绍了Go语言为什么不支持三元运算符原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 如何使用 Go 获取你的 IP 地址(推荐)

    如何使用 Go 获取你的 IP 地址(推荐)

    在Go语言中,获取IP地址分为公共IP和私有IP两种方式,公共IP地址通过外部API获取,本文给大家介绍如何使用 Go 获取你的 IP 地址,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Go语言中Seeker接口的用法详解

    Go语言中Seeker接口的用法详解

    Go语言标准库中的io包提供了一系列接口,用于处理各种I/O操作,其中Seeker接口在处理大文件或需要随机访问的场景中非常有用,本文将结合具体案例,详细介绍Go语言中io包的Seeker接口的用法,需要的朋友可以参考下
    2024-10-10
  • Golang自旋锁的相关介绍

    Golang自旋锁的相关介绍

    自旋锁是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断地判断是否能够被成功获取,知直到获取到锁才会退出循环
    2022-10-10
  • GO 集合 map 使用示例小结

    GO 集合 map 使用示例小结

    Go语言的集合称为映射(map),它是一种无序的键值对(key-value)的集合,集合是通过键(key)来快速检索值(value)的,键(key)类似于索引,它指向值(value)的数据,这篇文章主要介绍了GO集合map使用总结,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 解决Golang map range遍历结果不稳定问题

    解决Golang map range遍历结果不稳定问题

    这篇文章主要介绍了解决Golang map range遍历结果不稳定问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一文详解Golang中consul的基本使用

    一文详解Golang中consul的基本使用

    consul是一个开源服务注册和服务发现的中心,可以用于微服务的注册和服务之间的调用的发现,帮助上游服务找到下游服务的具体ip:port或者是domain,也可以使用dns的方式让consul帮你去做转发。本文就来讲讲它的具体使用吧
    2023-03-03
  • Golang利用位运算实现为程序加速

    Golang利用位运算实现为程序加速

    这篇文章主要为大家详细介绍了如何在Golang中利用位运算实现为程序加速功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • Golang中的同步工具sync.WaitGroup详解

    Golang中的同步工具sync.WaitGroup详解

    这篇文章主要详细为大家介绍了Golang中的同步工具sync.WaitGroup,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2023-05-05

最新评论