我的问题:我想在(kde dolphins servicemenu)中创建一个桌面条目来转换音频/视频文件。
我已尝试如下方法:
[Desktop Entry]
Actions=Convertwav2Mp3
Icon=audio-x-flac
MimeType=audio/*
ServiceTypes=KonqPopupMenu/Plugin
Type=Service
X-KDE-Priority=TopLevel
[Desktop Action Convertwav2Mp3]
Exec=ffmpeg -i %f -codec:a libmp3lame -b:a 320k .out.mp3 && mv .out.mp3 %f
Icon=audio-x-flac
Name=Convertwav2Mp3
放入 /usr/share/kservices5/ServiceMenus/ 后效果很好。
但是:mv 命令会将输出文件重命名为原始文件名及其文件扩展名(原先是 wav 但应该是 mp3)。
我如何在 Exec 字段中更改命令以将其从 file.wav 重命名为 file.mp3?
答案1
选项 1:附加 .mp3
Exec=ffmpeg -i %f -codec:a libmp3lame -b:a 320k %f.mp3
这将导致例如转换
my_file.wav
到
my_file.wav.mp3
这可能并不是我们所希望的。
有趣的事实:曾经有一个%n
给出基本名称的键,如下所示:
Exec=ffmpeg -i %f -codec:a libmp3lame -b:a 320k %n.mp3
FreeDesktop 规范已将其列为从 1.0 版开始弃用的功能:
弃用的
Exec
字段代码:... %n(文件的基本名称)...
https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html
这可能在旧版本的 Dolphin 中起作用,但在我使用的版本(17.12.3)中,密钥%n
与密钥相同%f
,因此这不会按预期工作。
选项 #2:使用 bash 参数扩展
要获得这个,请执行以下操作:
my_file.mp3
我们需要删除文件扩展名。可以使用以下方法完成此操作 bash 参数扩展:
Exec=bash -c 'wavfile='\''%f'\''; mp3file="${wavfile%.wav}.mp3"; ffmpeg -i '\''%f'\'' -codec:a libmp3lame -b:a 320k "$mp3file"'
我们必须明确调用 bash,因为Exec
密钥是通过的/bin/sh
,而它不支持这种语法。
注意事项
这两个选项都适用于包含空格的文件名。但是,在其他情况下,它们将无法按预期工作,例如:
如果 MP3 文件名已经存在,它将会自动失败。
如果 WAV 文件名包含参数扩展字符串(如
$0
或),$USER
它将默认失败。`date`
如果 WAV 文件名包含诸如或的命令替换字符串,$(date)
它将默认失败。如果 WAV 文件名是 而不是
example.WAV
,example.wav
则结果为example.WAV.mp3
。
为了使这些问题更易于处理和调试,我建议编写一个单独的 shell 脚本并直接调用它;有很多例子:
进一步评论
另外,你可能已经知道这一点,但桌面文件可以复制到
~/.local/share/kservices5/ServiceMenus/
代替
/usr/share/kservices5/ServiceMenus/
如果您想为单个用户安装它或者没有 root 权限,这很有用。
最后,我建议使用
MimeType=audio/x-wav
代替
MimeType=audio/*
因为这只适用于 WAV 文件。
相关问题: