设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

荣耀也罢,屈辱也罢,都要以平和的心态去面对,少一些无奈与感慨,多一份从容和淡然。晚安!

查看: 2570|回复: 4

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:204
  • 打卡月天数:0
  • 打卡总奖励:3221
  • 最近打卡:2023-08-27 04:32:00
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
446
主题
416
精华
0
金钱
4524
积分
887
注册时间
2022-12-25
最后登录
2025-5-31

发表于 2024-5-28 16:14:28 来自手机 | 显示全部楼层 |阅读模式
目录


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

一、工具简介

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

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

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

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

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

二、使用golang获取时间长
  1. package main

  2. import (
  3.         "bufio"
  4.         "fmt"
  5.         "os/exec"
  6.         "strconv"
  7. )

  8. // getDuration 通过调用 ffprobe 来获取音视频文件的时长

  9. // 函数接收一个字符串参数 filePath,表示音视频文件的路径。
  10. // 函数返回两个值:一个整数表示时长(秒),一个 error 表示可能发生的错误。
  11. func getDuration(filePath string) (int, error) {

  12.         // 使用 exec.Command 创建一个新的命令,调用 ffprobe 并带上一系列参数来指示它只输出文件的时长。
  13.         cmd := exec.Command("/Users/lijie/workspace/ffmpeg-lijie/ffprobe", "-v", "error", "-show_entries", "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", filePath)

  14.         //通过 StdoutPipe 方法获取命令的标准输出流,以便我们可以读取 ffprobe 的输出。
  15.         stdout, err := cmd.StdoutPipe()
  16.         //如果在获取输出流时发生错误,则返回错误。
  17.         if err != nil {
  18.                 return 0, err
  19.         }

  20.         //启动 ffprobe 命令。如果启动失败,则返回错误。
  21.         if err := cmd.Start(); err != nil {
  22.                 return 0, err
  23.         }

  24.         //创建一个新的 bufio.Scanner 来读取 ffprobe 的标准输出。
  25.         scanner := bufio.NewScanner(stdout)

  26.         //使用 Scan 方法读取输出的第一行(即文件的时长)。
  27.         if scanner.Scan() {
  28.                 //scanner.Text() 获取读取到的字符串。
  29.                 durationStr := scanner.Text()
  30.                 //使用 strconv.ParseFloat 将时长字符串转换为浮点数。
  31.                 duration, err := strconv.ParseFloat(durationStr, 64)
  32.                 //如果转换失败,则返回错误。
  33.                 if err != nil {
  34.                         return 0, err
  35.                 }
  36.                 //将浮点数时长转换为整数(秒),并返回,没有错误。
  37.                 return int(duration), nil
  38.         }
  39.         return 0, fmt.Errorf("no duration found")

  40. }

  41. // formatDurationSeconds 函数将秒数转换为分秒格式的字符串。
  42. // 函数接收一个整数参数 seconds,表示时长(秒)。
  43. // 函数返回一个字符串,表示时分秒格式的时长。
  44. func formatDurationSeconds(seconds int) string {
  45.         //计算时钟数,通过将总秒数除以3600。
  46.         hours := seconds / 3600
  47.         //计算分钟数,通过将总秒数除以60。
  48.         minutes := (seconds % 3600) / 60
  49.         //计算剩余的秒数,通过取总秒数除以60的余数。
  50.         seconds = seconds % 60

  51.         //根据秒数自动判断是否包含小时,并相应地格式化输出
  52.         if hours > 0 {
  53.                 //根据秒数自动判断是否包含分钟,并相应地格式化输出
  54.                 if minutes > 0 {
  55.                         //使用 fmt.Sprintf 格式化分钟和秒数为 "MM:SS" 格式的字符串,并确保分钟和秒数都是两位数(不足两位时前面补0)。
  56.                         return fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)
  57.                 } else {
  58.                         return fmt.Sprintf("%02d:%02d", hours, seconds)
  59.                 }
  60.         } else if minutes > 0 {
  61.                 return fmt.Sprintf("%02d:%02d", minutes, seconds)
  62.         } else {
  63.                 return fmt.Sprintf("00:%02d", seconds)
  64.         }

  65. }
  66. func main() {
  67.    //定义音视频文件的路径,并替换为实际的文件路径。
  68.         filePath := "/opt/www/nginx/html/pages/resource/input.mp3"

  69.         //调用 getDuration 函数获取文件的时长(秒)。
  70.         durationSeconds, err := getDuration(filePath)
  71.         //如果在获取时长时发生错误,则打印错误并退出程序。
  72.         if err != nil {
  73.                 fmt.Println("Error getting duration:", err)
  74.                 return
  75.         }
  76.         fmt.Println("Duration:", durationSeconds)
  77.         //调用 formatDurationSeconds 函数将时长(秒)转换为时分秒格式的字符串。
  78.         durationFormatted := formatDurationSeconds(durationSeconds)
  79.         fmt.Printf("Duration: %s\n", durationFormatted)
  80. }
复制代码
到此这篇关于使用Golang获取音视频时长信息的示例代码的文章就介绍到这了,更多相关Golang获取时间长内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2025-1-8 16:06:37 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-7-17
最后登录
2024-7-17

发表于 2025-1-13 16:34:27 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2025-12-2 18:51:18 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-29
最后登录
2022-12-29

发表于 5 天前 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表