首页 > 其他分享 >golang之媒体处理

golang之媒体处理

时间:2023-12-05 10:33:18浏览次数:40  
标签:err 媒体 处理 oss boxHeader BoxHeader golang 获取 offset

[视频]

获取视频封面图:

1) 如果是使用oss的话, 可以添加指定的后缀生成指定图片

 

 

获取视频长度:

1)若是oss上的视频,则可以使用阿里云的IMM中的提取视频信息的服务

注意这里获取需要使用到签名之后获取对应的数据

 

这里使用基于阿里云oss包: 

github.com/aliyun/aliyun-oss-go-sdk/oss    

 

2)对于在线视频

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
    "io"
    "os"
)

// 获取本地文件视频秒数

// BoxHeader 信息头
type BoxHeader struct {
    Size       uint32
    FourccType [4]byte
    Size64     uint64
}

func main() {
    url := "./video.mp4"
    file, err := os.Open(url)
    if err != nil {
        panic(err)
    }
    duration, err := GetMP4Duration(file)
    if err != nil {
        panic(err)
    }
    fmt.Println(duration)
}

// GetMP4Duration 获取视频时长,以秒计
func GetMP4Duration(reader io.ReaderAt) (lengthOfTime uint32, err error) {
    var info = make([]byte, 0x10)
    var boxHeader BoxHeader
    var offset int64 = 0
    // 获取moov结构偏移
    for {
        _, err = reader.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)
    }
    // 获取moov结构开头一部分
    moovStartBytes := make([]byte, 0x100)
    _, err = reader.ReadAt(moovStartBytes, offset)
    if err != nil {
        return
    }
    // 定义timeScale与Duration偏移
    timeScaleOffset := 0x1C
    durationOffest := 0x20
    timeScale := binary.BigEndian.Uint32(moovStartBytes[timeScaleOffset : timeScaleOffset+4])
    Duration := binary.BigEndian.Uint32(moovStartBytes[durationOffest : durationOffest+4])
    lengthOfTime = Duration / timeScale
    return
}

// 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
}

另外还有其他第三方库可以使用:

go get -u github.com/Stitch-Zhang/gmp4

  

 

标签:err,媒体,处理,oss,boxHeader,BoxHeader,golang,获取,offset
From: https://www.cnblogs.com/xingxia/p/golang_media.html

相关文章

  • C#中的并行处理、并行查询的方法你用对了吗?
    Parallel.ForEachParallel.ForEach 是一个用于在集合上并行执行迭代操作的强大工具。它通过有效地利用多核处理器的能力来提高性能。Parallel.ForEach 不仅能够简化并行编程,而且它在执行简单循环时可以提供比传统迭代更好的性能。下面是一个简单的示例,演示了如何使用 Paralle......
  • Java基础故障处理工具
    适用场景:生产环境由于可视化工具侵入系统,带来资源占用、安全问题或者规模较小未部署可视化监控平台,此时要使用基础命令行工具;给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾......
  • 异常处理
    一,可避免语法异常SyntaxError1ifx>10#if后面没有冒号2print("xisgreaterthan10")NameErrorname,变量名字取得有问题二,难点异常什么时候最容易出异常当你要处理的内容不确定的时候有用户参与有外界数据接入:从文件中读,从网络上获取。多行报......
  • 使用阿里云oss处理图片的格式转换
    方式一:图片上传阿里云oss之后,可以在后缀添加要求获取想要的图片,在?x-oss-process后面添加想要的参数例如,对原图example.jpg添加图片缩放resize以及质量变换quality参数后,文件URL为https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/example.jpg?x-oss-proces......
  • 如何快速处理Git push错误的记录
    命令行如下gitreset--hardHEAD^可以本地删掉最后一个commit。gitpush--force-with-lease推送到远程删掉最后一个commitgitcherry-pickHASH最后本地恢复最后一个commit。演示操作1.准备错误的记录并进行push 可以看到push成功 2.命令行处理2.1先git......
  • 八. 异常处理和命名空间
    1.异常处理注意:以下内容在C++11中进行了优化,不再适用。在C++98中,为程序可能出现的异常提供了一套完整的机制,其基本语法如下:抛出异常:throw表达式;trycatch代码块:try{ 复合语句}catch(异常类型){复合语句}catch(异常类型){复合语句}抛出机制:当函......
  • 文字处理软件Word mac特点介绍
    MicrosoftWordmac是一款文字处理软件。它是Microsoft office 套件的一部分,已广泛用于创建、编辑和格式化文本文档。Wordmac软件特点改进的协作工具:使用MicrosoftWord2021,多个用户可以同时处理一个文档,从而更轻松地与同事或同学协作。增强的人工智能写作辅助:新版Word配备......
  • go-carbon v2.2.14 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库
    carbon是一个轻量级、语义化、对开发者友好的golang时间处理库,支持链式调用。目前已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/carbongitee.com/golang-module/carbon安装使用Golang版本大于等于1.16//使用github库goget-ugithu......
  • charles-造数据,接口返回值固定怎么处理
    问题现象:界面请求第三方接口时,某个字段没有返回正确或者想要修改接口返回值,那么解决的办法是打断点,每次修改接口返回值,但是这样做太麻烦了,测试100次,得改100次。         所以有个简单的办法,只需要将接口返回保存到一个文件中,每次请求都走这个文件,就解决了这个......
  • 后台处理指南
    后台处理指南 | Android开发者 | AndroidDevelopershttps://developer.android.google.cn/guide/background?hl=zh-cnProcessingdatainthebackgroundisanimportantpartofcreatinganAndroidapplicationthatisbothresponsiveforyourusersaswella......