fuse与gstreamer转码
我正在尝试创建一个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,它们几乎可以完全实现你提到的功能。