2023-04-21:用go语言重写ffmpeg的metadata.c示例。
2023-04-21:用go语言重写ffmpeg的metadata.c示例。
答案2023-04-21:
这段 Go 代码演示了如何使用 ffmpeg-go 库中的函数来读取多媒体文件元数据,包括视频、音频等信息。它的大体过程如下:
- 设置环境变量以加载 FFmpeg 动态链接库
这里将 FFmpeg 库中的各个动态链接库路径添加到环境变量 PATH 中,以便在程序运行时能够自动加载。同时,通过 ffcommon 包中提供的函数设置各个库的路径。
- 创建一个输出目录
如果指定的输出目录不存在,则创建一个新的目录用于存储输出文件。
- 打开输入文件并查找流信息
使用 libavformat.AvformatOpenInput() 函数打开用户指定的输入文件,并将返回的 AVFormatContext 结构体指针赋值给 fmt_ctx 变量。然后调用 fmt_ctx.AvformatFindStreamInfo(nil) 函数查找输入文件中的流信息。
- 遍历元数据并输出
使用 fmt_ctx.Metadata.AvDictGet() 函数获取输入文件中的元数据。该函数返回指向 AVDictionaryEntry 结构体的指针,其中包含键值对形式的元数据信息。使用 for 循环遍历所有元数据,并使用 fmt.Printf() 函数输出每个元数据的键值对。
- 关闭输入文件
使用 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
}

2023-04-21:用go语言重写ffmpeg的metadata.c示例。的更多相关文章
- 21世纪C语言(影印版)
<21世纪C语言(影印版)> 基本信息 原书名:21st Century C 作者: Ben Klemens 出版社:东南大学出版社 ISBN:9787564142056 上架时间:201 ...
- Ubuntu 12.04上安装R语言
Ubuntu 12.04上安装R语言 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ R的安装 sudo gedit /etc/apt/sources. ...
- Ubuntu 18.04 安装配置 go 语言
Ubuntu 18.04 安装配置 go 语言 1.下载 下载 jdk 到 Downloands 文件夹下 cd 进入 /usr/local, 创建 go 文件夹, 然后 cd 进这个文件夹 cd / ...
- 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- 最简单的基于FFmpeg的libswscale的示例附件:测试图片生成工具
===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- XE3随笔21:系统默认语言与系统支持的语言列表
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- Ubuntu_16.04 配置 Apache Rwrite URL 重写
Ubuntu Apache配置Rwrite URL重写 0. apache目录
- Ubuntu16.04 部署配置GO语言开发环境 & 注意事项
1. 安装GO 安装go语言包: $ curl -O https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz 下载完成后 ...
- Ubuntu 18.04 LTS搭建GO语言开发环境
一.下载Go语言安装包 官网下载地址:https://golang.org/dl/,使用tar命令将档案包解压到/usr/local目录中: sudo tar -C /usr/local -xzf g ...
随机推荐
- redis linux源码安装
1.官网下载安装包 2.解压 3.确认GCC环境 4.make 5.修改conf配置文件守护进程daemonize yes和默认密码requirepass password 5.启动 安装目录src/ ...
- Jmeter--请求结果写入文件并生成报告
一.数据写入文件 Jmeter中监听器控件中,都可以将"所有数据写入一个文件",且文件形式有:xml\jtl\csv 在需要写入的监听器下点击"浏览"按钮,选择 ...
- “你帮我助”软件开发(Final)
本项目是上海交通大学 CS-3331 软件工程课程大作业. 作业描述 "你帮我助"软件开发(Final) 新的功能需求: 物品有公共的信息(物品名称,物品说明,物品所在地址,联系人 ...
- 例题1:shell脚本
题目总结: 1.搜索子域名的shell脚本 2.嗅探并抓去网页快照shell脚本 3.漏洞利用程序下载脚本 题目一:依次输入以下代码即可: 1.wget www.megacorpone.com 2. ...
- axios utils axios.postForm
npm install axios -S 目录 ajax.js 请求工具 /* ajax请求函数模块 返回值: promise对象(异步返回的数据是: response.data) */ impo ...
- OSPF之路由撤销
- Python学习笔记--高阶技巧
闭包(避免全局变量被修改的风险) 函数的嵌套的利用 若是只是调用到外部函数的值,只需要用到函数的嵌套,具体实现如下: 若是要对外部函数的值进行修改,需要用到nonlocal关键字,具体实现如下: at ...
- Linux & 标准C语言学习 <DAY12_2>
一.堆内存 1.什么是堆内存 是进程的一个内存段(text.data.bss.stack.heap) 由程序员手动管理 特点是足够大,缺点是使用 ...
- 车企-TSP系统通用架构设计
最近一年用于参与到了新能源车企的管理系统的开发,并且主要从事架构设计与重难点功能开发的工作,因此有了一些小心得,特此记录(PS:整体和甲方在需求上扯皮,以及协调所有供应商这些项目管理上的事情比做开发耗 ...
- Python学习之爬虫
又被老师要求去搞Python ,曰,,下午回顾了一下Python的基础知识,写了个爬取图片的程序,在此做个分享吧.不喜勿喷 import requests import time from bs4 i ...