Golang获取视频时长并转成时分秒

解析视频

//constant.DurationFormat="00:00:00"// BoxHeader 信息头
type BoxHeader struct {Size       uint32FourccType [4]byteSize64     uint64
}
//filePath 视频地址
func GetMP4Duration(filePath string) (duration string, err error) {file, err := os.Open(filePath)if err != nil {if strings.Contains(err.Error(), "no such file or directory") {return constant.DurationFormat, errors.New("文件不存在")}return constant.DurationFormat, err}defer func(file *os.File) {err = file.Close()if err != nil {zap.L().Error("file close fail err:",zap.Error(err))}}(file)var (info      = make([]byte, 0x10)boxHeader BoxHeaderoffset    int64 = 0)// 获取结构偏移for {_, err = file.ReadAt(info, offset)if err != nil {return}boxHeader = getHeaderBoxInfo(info)fourccType := getFourccType(boxHeader)if fourccType == "moov" {break}// 有一部分mp4 mdat尺寸过大需要特殊处理if fourccType == "mdat" {if boxHeader.Size == 1 {offset += int64(boxHeader.Size64)continue}}offset += int64(boxHeader.Size)}// 获取move结构开头一部分moveStartBytes := make([]byte, 0x100)_, err = file.ReadAt(moveStartBytes, offset)if err != nil {return}// 定义timeScale与Duration偏移timeScaleOffset := 0x1CdurationOffset := 0x20timeScale := binary.BigEndian.Uint32(moveStartBytes[timeScaleOffset : timeScaleOffset+4])Duration := binary.BigEndian.Uint32(moveStartBytes[durationOffset : durationOffset+4])return ResolveTime(Duration / timeScale), nil
}// getHeaderBoxInfo 获取头信息
func getHeaderBoxInfo(data []byte) (boxHeader BoxHeader) {buf := bytes.NewBuffer(data)_ = binary.Read(buf, binary.BigEndian, &boxHeader)return
}// getFourccType 获取信息头类型
func getFourccType(boxHeader BoxHeader) (fourccType string) {fourccType = string(boxHeader.FourccType[:])return
}

转成时分秒(00:00:00)

// ResolveTime 将秒转成时分秒格式
func ResolveTime(seconds uint32) string {var (h, m, s string)var day = seconds / (24 * 3600)hour := (seconds - day*3600*24) / 3600minute := (seconds - day*24*3600 - hour*3600) / 60second := seconds - day*24*3600 - hour*3600 - minute*60h = strconv.Itoa(int(hour))if hour < 10 {h = "0" + strconv.Itoa(int(hour))}m = strconv.Itoa(int(minute))if minute < 10 {m = "0" + strconv.Itoa(int(minute))}s = strconv.Itoa(int(second))if second < 10 {s = "0" + strconv.Itoa(int(second))}return fmt.Sprintf("%s:%s:%s", h, m, s)
}

调用

mediaUrl := "/www/data/video/1.mp4"
duration, err = GetMP4Duration(mediaUrl)
if err != nil {zap.L().Error("get video duration error", zap.Error(err))return}
fmt.Println(duration)

Golang获取视频时长相关推荐

  1. Java通过FFMPEG获取视频时长

    2019独角兽企业重金招聘Python工程师标准>>> Java通过FFMPEG获取视频时长 详见https://www.yz1618.cn/view/19 转载于:https:// ...

  2. java如何截取视频文件_Java获取视频时长及截取帧截图详解

    前言 只是最近碰到有这方面的项目需求,所以简单 Mark 下本文.下面的示例是参考过他人分享的文章,之后本人再自行实践.调整和测试过的,希望对有这方面需求的人有所帮助. 示例 添加依赖 org.byt ...

  3. java获得U盘根目录、读取图片视频头文件信息、获取视频时长

    1.获得U盘根目录,例如我们取名U盘名称为"测试U盘",一般插入U盘后,在系统的H盘 /** * 得到系统U盘根目录 */ public String findURootPath( ...

  4. uni-app小程序如何获取视频时长

    uni-app小程序如何获取视频时长 从网上搜寻了一下发现都没有单纯获取视频时长的方法,于是只能自己研究一下了 uni-app和小程序都提供了video组件,却发现并没有提供获取视频时长属性或方法, ...

  5. java获取视频时长_Java获取视频的大小、时长

    前端上传视频之后,根据上传的视频文件获取视频的大小和时长 1.获取视频时长 private String ReadVideoTime(File source) { Encoder encoder = ...

  6. ffmpeg获取视频时长和分辨率

    文章目录 ffmpeg获取视频文件时长和分辨率 获取视频时长 获取视频分辨率 ffmpeg获取视频文件时长和分辨率 获取视频时长 import os import subprocess# video_ ...

  7. java获取视频时长(实测可行)

    因为数据库视频表有一段时间丢失维护duration字段, 现在有需求需要用到此字段,只能再重新获取一遍, 更新表.哎!!! 先奉上 https://github.com/opensourceteams ...

  8. java获取视频时长

    java获取视频时长 需要一个包,没有的找我要(java-1.0.2-1.0.2.jar) 一个可以通过视频的url地址或者是上传视频 文件有类型为(MultipartFile)的来获取视频的时长. ...

  9. 通过ffmpeg获取视频时长

    通过Java获取视频时长,可以通过jave和ffmpeg这两种工具来获取,jave和ffmpeg都能拿到本地视频文件的时长,可如果是播放视频URL,就只能通过ffmpeg来获取. 现在视频文件基本上都 ...

最新文章

  1. c语言N*N的二维数组,c语言高手帮个忙(请先看问题,好解答
  2. 卢京潮自动控制原理ppt_视觉定位系统在贴片机中的使用与原理作用
  3. python画图程序-编程入门06:Python海龟绘图
  4. Storm中并行度原来是这样计算的(1.0.1版本)
  5. 分析决策树算法和逻辑回归算法的不同之处
  6. 2021年暑期旅游数据报告
  7. 如何评估数据适不适合放入Redis中?
  8. SageMaker 超参数优化作业
  9. Apollo添加新的can通信接口的GPS设备
  10. 数据库逻辑结构设计 → E-R图
  11. 【RFID】RFID的标准体系
  12. 我的世界贝爷生存用什么Java_我的世界贝爷生存MOD教程 [MITE] MC实在是太简单了教程详解 | 我的世界 | MC世界侠...
  13. 基于python的LSB加密算法设计
  14. 电路板常用连接器(接插件)介绍与选型建议(板对板连接器,板对线连接器,线对线连接器等)
  15. 微信公众号:提示“redirect_uri 参数错误”
  16. iOS 组件化加载本地 gif 图片
  17. 使用VS+VisualGDB编译Linux版本RCF
  18. java学不下去能学web安全吗,这半年学习 Web 安全的一点心得体会
  19. 学大伟业Day解题报告
  20. pg 快速造1000w测试数据

热门文章

  1. 微信小程序直播前端实现
  2. 自己搭建一个SSM框架
  3. 硬盘数据恢复 U盘数据恢复 移动硬盘数据恢复
  4. 不同区域读取NVRAM数据
  5. Linux运维——权限管理
  6. markdown常用数学符号小结⌈ ⌉⌊ ⌋
  7. MySQL获取近12个月数据SQL
  8. nike blazer schweiz hinter dem Handtuch
  9. docker的基本使用方法
  10. 可视化了解一下?ECharts 4.0最全技术攻略