fuse与gstreamer转码

0 投票
2 回答
707 浏览
提问于 2025-04-16 02:11

我正在尝试创建一个FUSE文件系统,它可以把所有音频文件转换成mp3格式。我的第一个想法是用gstreamer作为转换的后台工具。

我考虑使用这个处理流程:

gst-launch -v filesrc location=01\ New\ Born.flac ! decodebin ! audioconvert ! lame vbr=4 vbr-quality=9 ! id3v2mux ! appsink

FUSE的Python绑定在读取文件时会调用这个函数:

def read(self, length, offset):

我该如何把gstreamer的缓冲区传输到FUSE文件系统呢?我不知道该怎么处理这个问题。我之前从来没有使用过appsink。

我希望我说的能让你明白我的意思。

2 个回答

0

你试过以下方法吗:

giosink 可以写入任何支持GIO的地方

giosrc 可以从任何支持GIO的地方读取

使用Gio的话,你应该可以把FUSE当作普通的文件系统来使用。

0

我觉得你不需要去搞 appsink。我的感觉是,把转码的部分和文件系统的部分分开越远越好。可以在一个单独的线程或进程中进行转码,转码的结果写入一个文件,然后通过消息告诉 FUSE 守护进程转码进展到哪了。

与其使用 appsink,我建议用 filesink,创建几个工作线程或进程来转码,把 .mp3 文件写入一个大小受控的缓存目录,并让 read() 阻塞,直到转码的文件足够长,可以满足请求。

这是 filesink 的源代码。在没有寻址的情况下,它似乎只是把每个缓冲区的内容追加到文件中。http://mediatools.cs.ucl.ac.uk/nets/newvideo/browser/gst-cvs/gstreamer/plugins/elements/gstfilesink.c#L436

你也可以省去很多时间和麻烦,直接下载 mp3fs 或者 gstfs,它们几乎可以完全实现你提到的功能。

撰写回答