首页 > 其他分享 >2023-04-21:用go语言重写ffmpeg的metadata.c示例。

2023-04-21:用go语言重写ffmpeg的metadata.c示例。

时间:2023-04-21 22:48:44浏览次数:62  
标签:lib ffmpeg 04 示例 fmt ctx ffcommon go os

2023-04-21:用go语言重写ffmpeg的metadata.c示例。

答案2023-04-21:

这段 Go 代码演示了如何使用 ffmpeg-go 库中的函数来读取多媒体文件元数据,包括视频、音频等信息。它的大体过程如下:

  1. 设置环境变量以加载 FFmpeg 动态链接库

这里将 FFmpeg 库中的各个动态链接库路径添加到环境变量 PATH 中,以便在程序运行时能够自动加载。同时,通过 ffcommon 包中提供的函数设置各个库的路径。

  1. 创建一个输出目录

如果指定的输出目录不存在,则创建一个新的目录用于存储输出文件。

  1. 打开输入文件并查找流信息

使用 libavformat.AvformatOpenInput() 函数打开用户指定的输入文件,并将返回的 AVFormatContext 结构体指针赋值给 fmt_ctx 变量。然后调用 fmt_ctx.AvformatFindStreamInfo(nil) 函数查找输入文件中的流信息。

  1. 遍历元数据并输出

使用 fmt_ctx.Metadata.AvDictGet() 函数获取输入文件中的元数据。该函数返回指向 AVDictionaryEntry 结构体的指针,其中包含键值对形式的元数据信息。使用 for 循环遍历所有元数据,并使用 fmt.Printf() 函数输出每个元数据的键值对。

  1. 关闭输入文件

使用 libavformat.AvformatCloseInput(&fmt_ctx) 函数关闭输入文件并释放内存。

使用github/moonfdd/ffmpeg-go库。

命令如下:

go run ./examples/internalexamples/metadata/main.go ./resources/big_buck_bunny.mp4

golang代码如下:

package main

import (
	"fmt"
	"os"

	"github.com/moonfdd/ffmpeg-go/ffcommon"
	"github.com/moonfdd/ffmpeg-go/libavformat"
	"github.com/moonfdd/ffmpeg-go/libavutil"
)

func main() {
	// go run ./examples/internalexamples/metadata/main.go ./resources/big_buck_bunny.mp4

	os.Setenv("Path", os.Getenv("Path")+";./lib")
	ffcommon.SetAvutilPath("./lib/avutil-56.dll")
	ffcommon.SetAvcodecPath("./lib/avcodec-58.dll")
	ffcommon.SetAvdevicePath("./lib/avdevice-58.dll")
	ffcommon.SetAvfilterPath("./lib/avfilter-56.dll")
	ffcommon.SetAvformatPath("./lib/avformat-58.dll")
	ffcommon.SetAvpostprocPath("./lib/postproc-55.dll")
	ffcommon.SetAvswresamplePath("./lib/swresample-3.dll")
	ffcommon.SetAvswscalePath("./lib/swscale-5.dll")

	genDir := "./out"
	_, err := os.Stat(genDir)
	if err != nil {
		if os.IsNotExist(err) {
			os.Mkdir(genDir, 0777) //  Everyone can read write and execute
		}
	}
	main0()
}

func main0() (ret ffcommon.FInt) {
	var fmt_ctx *libavformat.AVFormatContext
	var tag *libavutil.AVDictionaryEntry

	if len(os.Args) != 2 {
		fmt.Printf("usage: %s <input_file>\nexample program to demonstrate the use of the libavformat metadata API.\n\n", os.Args[0])
		return 1
	}
	ret = libavformat.AvformatOpenInput(&fmt_ctx, os.Args[1], nil, nil)
	if ret != 0 {
		return ret
	}

	ret = fmt_ctx.AvformatFindStreamInfo(nil)
	if ret < 0 {
		libavutil.AvLog(uintptr(0), libavutil.AV_LOG_ERROR, "Cannot find stream information\n")
		return ret
	}

	tag = fmt_ctx.Metadata.AvDictGet("", tag, libavutil.AV_DICT_IGNORE_SUFFIX)
	for tag != nil {
		fmt.Printf("%s=%s\n", ffcommon.StringFromPtr(tag.Key), ffcommon.StringFromPtr(tag.Value))
		tag = fmt_ctx.Metadata.AvDictGet("", tag, libavutil.AV_DICT_IGNORE_SUFFIX)
	}

	libavformat.AvformatCloseInput(&fmt_ctx)
	return 0
}

在这里插入图片描述

标签:lib,ffmpeg,04,示例,fmt,ctx,ffcommon,go,os
From: https://www.cnblogs.com/waitmoon/p/17342074.html

相关文章

  • day04-商家查询缓存03
    功能02-商铺查询缓存033.功能02-商铺查询缓存3.6封装redis工具类3.6.1需求说明基于StringRedisTemplate封装一个工具列,满足下列需求:方法1:将任意Java对象序列化为json,并存储在string类型的key中,并且可以设置TTL过期时间方法2:将任意Java对象序列化为json,并存储在string类型的k......
  • 2023.04.19总结
    题目1:abc252_f题意有一个长度为\(l\)的面包,要把这块面包切成\(n\)段,$a_1,a_2,\dots,a_n$,有剩下的不分配。将一块长度为\(k\)的面包切成两块的代价为\(k\),问要将面包切成\(n\)段的最小代价。\(1\len\le10^5,1\lea_i\le10^9,\sum\limits_{i=1}^na_i......
  • 04 数据类型
    04数据类型创建表的时候,我们在类型这里给出了不同的选项,比如有int,varchar。数据类型不同,储存的内容也不相同。下面来看看MySQL的数据类型介绍数据类型分类整数类型:BIT、BOOL、TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT浮点数类型:FLOAT、DOUBLE、DECIMAL字符串......
  • 每日总结2023-04-21
    今天将补货的历史记录做出来了。补货历史界面: 修改了补货的界面,调整了预约时间 ......
  • 关于Nginx作为http-web服务器时对404错误页面的配置
    当我们访问一下Ngin部署的网站时,如果访问一个不存在的资源时,默认服务端会返回404错误,如下所示其实这个页面,我们也是可以自己创建一个页面作为404的返回的,可以通过即可以通过error_page code ...[=[response]] uri;进行配置其他说明:关于error_page指定能写的位置段为:ht......
  • C/C++课程信息管理系统[2023-04-21]
    C/C++课程信息管理系统[2023-04-21]综合应用所学C语言知识,设计完成一个软件工程专业课程信息管理系统。本系统拟实现以下功能:【数据文件】课程信息数据文件。每门课程的信息包含:课程编号,课程名称,理论课时实验课时、学分、开课学期(8个学期)、课程性质《分为必修、选修、限......
  • ffmpeg安装
    1.官网地址,去官网下载ffmpeg源码https://ffmpeg.org2.安装ffmpeg基础依赖sudoapt-getupdatesudoapt-getinstallbuild-essentialyasmtexi2htmllibvorbis-devlibmp3lame-devlibopus-devlibx264-devlibx265-devlibvpx-devlibfdk-aac-devlibass-devlibfreety......
  • eclipse IDE 创建一个jar和引用,示例
     一创建一个jar方法①创建一个jave程序,NewJar ②创建一个jave类,【Pachage:sayHello  Name:TestClass】    ③创建类的属性和方法可通过如下三种方法自动添加注释:(1)输入“/**”并回车。(2)用快捷键Alt+Shift+J(先选中某个方法、类名或变量名)。(3)在右键菜单中选择......
  • golang中通过原始socket实现tcp/udp的服务端和客户端示例
    这些天稍微空点,总结下golang中通过tcp/udp实现服务端客户端的编程实现,毕竟长久以来,如果要截单的http服务,我们直接使用net/http包实现服务,或者使用框架如gin/echo/beego等。以下就直接上代码,稍微看看都能懂起。1.TCP的实现serverpackagemainimport( "bufio" "fmt" "net"......
  • golang 中常用的超时控制的方案示例
    在go中,我们很容易就可以实现超时控制,今天分享2种解决方案:1.select+time.After2.select+context其实两种方案中,我们都是通过channel来控制的,在方案1中,对于time.After,通过返回一个只读<-chanTime实现,而context中,则通过context.Done()实现,通过返回<-chans......