2023-03-27:avio_list_dir.c 是 FFmpeg 库自带的一个示例程序,它提供了列出目录中所有文件和子目录的功能,请用go语言改写。
2023-03-27:avio_list_dir.c 是 FFmpeg 库自带的一个示例程序,它提供了列出目录中所有文件和子目录的功能,请用go语言改写。
答案2023-03-27:
这段代码实现了通过 AVIOContext 列出指定目录下的文件和子目录,并打印出它们的名称、大小、类型、权限等信息。
具体流程如下:
1.设置 FFmpeg 库的路径,以及调用 AvformatNetworkInit() 初始化网络相关的组件。
2.调用 AvioOpenDir() 打开指定目录,获取 AVIODirContext 对象。
3.循环调用 AVIODirContext.AvioReadDir() 方法读取目录下的文件和子目录,每次读取到一个目录项后,输出该目录项的信息。如果已经读取完所有目录项,则退出循环。
4.输出格式化的目录项信息,包括类型、大小、名称、权限等。
5.在每次循环中需要调用 AVIODirContext.AvioFreeDirectoryEntry() 方法释放当前目录项所占用的内存空间。
6.最后调用 AvioCloseDir() 关闭目录并销毁 AVIODirContext 对象,调用 AvformatNetworkDeinit() 释放网络相关的资源。
需要注意的是,这段代码只能在支持 AVIOContext 的平台上运行,例如 Linux 上的文件系统或者 S3、HDFS 等云存储服务。而 Windows 平台上不支持 AVIOContext,因此无法使用该方法列出目录下的文件和子目录。
代码见github/moonfdd/ffmpeg-go。
执行命令:
go run ./examples/internalexamples/avio_list_dir/main.go .
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() {
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) {
libavutil.AvLogSetLevel(libavutil.AV_LOG_DEBUG)
if len(os.Args) < 2 {
usage(os.Args[0])
ret = 1
return
}
libavformat.AvformatNetworkInit()
ret = list_op(os.Args[1])
libavformat.AvformatNetworkDeinit()
if ret < 0 {
ret = 1
}
return
}
func type_string(type0 int32) string {
switch type0 {
case libavformat.AVIO_ENTRY_DIRECTORY:
return "<DIR>"
case libavformat.AVIO_ENTRY_FILE:
return "<FILE>"
case libavformat.AVIO_ENTRY_BLOCK_DEVICE:
return "<BLOCK DEVICE>"
case libavformat.AVIO_ENTRY_CHARACTER_DEVICE:
return "<CHARACTER DEVICE>"
case libavformat.AVIO_ENTRY_NAMED_PIPE:
return "<PIPE>"
case libavformat.AVIO_ENTRY_SYMBOLIC_LINK:
return "<LINK>"
case libavformat.AVIO_ENTRY_SOCKET:
return "<SOCKET>"
case libavformat.AVIO_ENTRY_SERVER:
return "<SERVER>"
case libavformat.AVIO_ENTRY_SHARE:
return "<SHARE>"
case libavformat.AVIO_ENTRY_WORKGROUP:
return "<WORKGROUP>"
case libavformat.AVIO_ENTRY_UNKNOWN:
default:
break
}
return "<UNKNOWN>"
}
func list_op(input_dir string) (ret int32) {
var entry *libavformat.AVIODirEntry
var ctx *libavformat.AVIODirContext
var cnt int32
var filemode [4]byte
var uid_and_gid [20]byte
//注意Windows下会返回-40,也就是Function not implement,方法未实现,也就是说windows下不支持此方法
ret = libavformat.AvioOpenDir(&ctx, input_dir, nil)
defer libavformat.AvioCloseDir(&ctx)
if ret < 0 {
libavutil.AvLog(uintptr(0), libavutil.AV_LOG_ERROR, "Cannot open directory: %s.\n", libavutil.AvErr2str(ret))
return
}
cnt = 0
for {
ret = ctx.AvioReadDir(&entry)
if ret < 0 {
libavutil.AvLog(uintptr(0), libavutil.AV_LOG_ERROR, "Cannot list directory: %s.\n", libavutil.AvErr2str(ret))
return
}
if entry == nil {
break
}
if entry.Filemode == -1 {
filemode[0] = '?'
filemode[1] = '?'
filemode[2] = '?'
} else {
f := fmt.Sprint(entry.Filemode)
if len(f) >= 1 {
filemode[0] = f[0]
}
if len(f) >= 2 {
filemode[1] = f[1]
}
if len(f) >= 3 {
filemode[2] = f[2]
}
}
u := fmt.Sprintf("%d%d", entry.UserId, entry.GroupId)
copy(uid_and_gid[0:19], []byte(u))
if cnt == 0 {
libavutil.AvLog(uintptr(0), libavutil.AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
"TYPE", "SIZE", "NAME", "UID(GID)", "UGO", "MODIFIED",
"ACCESSED", "STATUS_CHANGED")
}
libavutil.AvLog(uintptr(0), libavutil.AV_LOG_INFO, "%-9s %12s %30s %10s %s %16s %16s %16s\n",
type_string(entry.Type),
fmt.Sprint(entry.Size),
ffcommon.StringFromPtr(entry.Name),
string(uid_and_gid[:]),
fmt.Sprint(filemode),
fmt.Sprint(entry.ModificationTimestamp),
fmt.Sprint(entry.AccessTimestamp),
fmt.Sprint(entry.StatusChangeTimestamp))
libavformat.AvioFreeDirectoryEntry(&entry)
cnt++
}
return
}
func usage(program_name string) {
fmt.Printf("usage: %s input_dir\nAPI example program to show how to list files in directory accessed through AVIOContext.\n", program_name)
}

2023-03-27:avio_list_dir.c 是 FFmpeg 库自带的一个示例程序,它提供了列出目录中所有文件和子目录的功能,请用go语言改写。的更多相关文章
- 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】
--------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...
- 实战FFmpeg--编译iOS平台使用的FFmpeg库(支持arm64的FFmpeg2.6.2)
编译环境:Mac OS X 10.10.2 ,Xcode 6.3 iOS SDK 8.3 FFmpeg库的下载地址是 http://www.ffmpeg.org/releases/ . ...
- FFmpeg示例程序合集-批量编译脚本
此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player: ...
- 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理
[源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...
- Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误
在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...
- 【转】FFMPEG 库移植到 VC 需要的步骤
原文:http://blog.csdn.net/leixiaohua1020/article/details/12747899 在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷 ...
- FFMPEG 库移植到 VC 需要的步骤
在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步.(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http: ...
- 【UWP】FFmpeg库的编译
本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的.如果大家遇到什么问题或是在之前 ...
- IOS应用FFMPEG库
1.引用资源 build-ffmpeg ffmpeg库生成 -sh开源地址: https://gist.github.com/m1entus/6983547 iFrameExtractor ffmp ...
- 手把手图文并茂教你用Android Studio编译FFmpeg库并移植
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331 之前曾写过一篇&l ...
随机推荐
- DNS Capture: UDP, TCP, IP-Fragmentation, EDNS, ECS, Cookie
EDNS 扩展实现"EDNS Client Subnet" (ECS) 和 DNS cookies.' 这里不讨论相关概念,实现如有疑问请查看: https://weberblog ...
- python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记
(如想转载,请联系博主或贴上本博地址) 此篇为上一篇pyqt5图像压缩小工具改良版.因为比较简单,下面直接贴上代码. 效果图: # -*- coding: utf-8 -*- # Form imple ...
- 实验九 团队作业6:团队项目编码与Alpha冲刺
项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 实验九-团队作业6 团队名称 零基础619 团队成员分工描述 任务1:荣娟,鑫任务2:亚楠,桂婷任务3:亚楠,桂婷任务4:荣娟,鑫任务 ...
- day09-拦截器&文件上传
拦截器&文件上传 1.拦截器-Interceptor 1.1拦截器概念 拦截器 拦截器(Interceptor):是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行. ...
- 正则表达式(cases)
匹配不含'aaa'和'bbb'的字符串: ^(?!.*aaa)(?!.*bbb).*$ To be continue...
- IP代理的使用 IP代理爬取视频
IP代理的使用 IP代理的分类 透明代理:目标网址知道你使用了代理并且知道你的源IP地址 匿名代理:匿名程序比较低 也就是网站知道你使用代理 但是查不出来源IP地址 高匿代理:网站不知道你使用了代理 ...
- Java 安全指南
Java 安全指南 后台类 I. 代码实现 1.1 数据持久化 1.1.1[必须]SQL语句默认使用预编译并绑定变量 Web后台系统应默认使用预编译绑定变量的形式创建sql语句,保持查询语句和数据相分 ...
- Little Snitch 5 - Mac 老牌防火墙安全工具软件小飞贼,监控和组织特定软件的网络连接
一旦连接到Internet,应用程序就可以随时随地发送它们想要的任何东西.通常情况下,他们是为你做的.但有时,例如在跟踪软件.木马或其他恶意软件的情况下,它们不会.但你不会注意到任何东西,因为所有这些 ...
- Linux 端口及防火墙常用命令
Linux 端口及防火墙操作 查看端口操作 一. netstat命令 -t (tcp) 仅显示tcp相关选项 -u (udp)仅显示udp相关选项 -n 拒绝显示别名,能显示数字的全部转化为数字 -l ...
- python进程之进程池、线程池与异步回调机制
进程线程不可以无限制的创建,因为有硬件的限制.为了避免资源被程序消耗过度,可以使用进程池或线程池的技术. 池 降低程序的执行效率,但是保证了计算机硬件的安全 进程池 提前创建好固定数量 ...