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语言改写。的更多相关文章

  1. 【VSCode】Windows下VSCode编译调试c/c++【更新 2018.03.27】

    --------– 2018.03.27 更新--------- 便携版已更新,点此获取便携版 已知BUG:中文目录无法正常调试 用于cpptools 0.15.0插件的配置文件更新 新的launch ...

  2. 实战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/ . ...

  3. FFmpeg示例程序合集-批量编译脚本

    此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player:                   ...

  4. 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

    [源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...

  5. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...

  6. 【转】FFMPEG 库移植到 VC 需要的步骤

    原文:http://blog.csdn.net/leixiaohua1020/article/details/12747899 在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷 ...

  7. FFMPEG 库移植到 VC 需要的步骤

    在VC下使用FFMPEG编译好的库,不仅仅是把.h,.lib,.dll拷贝到工程中就行了,还需要做以下几步.(此方法适用于自己使用MinGW编译的库,也同样适用于从网上下载的编译好的库,例如http: ...

  8. 【UWP】FFmpeg库的编译

    本文是关于windows8.1/windows10通用应用下编译ffmpeg的一些需要注意的地方,针对最新的msys2而写,都是我在实际操作中遇到的,但是网上没有提到的.如果大家遇到什么问题或是在之前 ...

  9. IOS应用FFMPEG库

    1.引用资源 build-ffmpeg  ffmpeg库生成 -sh开源地址: https://gist.github.com/m1entus/6983547 iFrameExtractor ffmp ...

  10. 手把手图文并茂教你用Android Studio编译FFmpeg库并移植

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52661331 之前曾写过一篇&l ...

随机推荐

  1. Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number

    IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>( ...

  2. 学习记录--C++继承与派生编程题

    1.设计一个圆类circle和一个桌子类table,另设计一个圆桌类roundtable,它是从前两个类派生出来的 要求输出一个圆桌的高度,面积与颜色等. #include<iostream&g ...

  3. swagger 增强UI --knife4j

    knife4j 文档:  https://gitee.com/xiaoym/knife4j (1)简介 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是sw ...

  4. DRF的序列化器Serializer

    一 序列化器的作用 1. 序列化,序列化器会把模型对象转换成字典,经过视图中response对象以后变成json字符串 2. 反序列化,视图中request会把客户端发送过来的数据转换成字典,序列化器 ...

  5. [SUCTF 2019]EasySQL 1

    这个题目搞了我好久,由于本人基础不扎实,试了好多方法,只发现有三种情况 Nonono.无返回结果和有返回 然后使用了新学习的堆叠注入,得到了数据库名和表名 想要查看Flag表的字段内容也查看不了 这里 ...

  6. FastJson 反序列化漏洞原理分析

    Fastjson 简介 fastjson框架:https://github.com/alibaba/fastjson fastjson-jndi:https://github.com/earayu/f ...

  7. 一文带你吃透Redis

    目录 1. 基本数据结构 2. 数据持久化 3. 高可用 4. 缓存 文章字数大约1.9万字,阅读大概需要66分钟,建议收藏后慢慢阅读!!! 1. 基本数据结构 什么是Redis Redis是一个数据 ...

  8. JAVA数据类型以及什么是字节

    强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义才能使用(安全性高) java的数据类型分为两大类 基本类型(primitive type) 引用类型(reference type) / ...

  9. Simulink的MATLAB function使用

    note 2021-02-21 下面的文章来自我的公众号 yhm同学 note 2021-04-01 今天审稿,发现存在着一些我没有发现的错误,但是我不想修改了. 原文链接 https://mp.we ...

  10. WordPress回复/评论本文可见

    给WordPress添加一个实用的小功能,那就是回复可见,评论文章才能见到隐藏内容. 在主题目录下找到functions.php文件,在合适位置添加下方的代码: // 回复可见 function re ...