我可以使用以下命令下载音频,但如何同时将其转换为 mp3 文件。
示例:下载 m4a 文件
yt-dlp -f 139 --external-downloader aria2c --external-downloader-args '-d ./ -x 10' <url>
使用以下方法将 m4a 文件转换为 mp3:
ffmpeg -i download_audio.m4a -codec:a libmp3lame -b:a 22050 -ac 1 -ar 22050 converted_audio.mp3
我怎样才能将这两个命令转换为一个?(这样我就不必执行两个单独的命令)
答案1
它出现yt-dlp
可以使用选项 ... 写入 STDOUT-o -
例如:
yt-dlp -o - -f 139 --external-downloader aria2c --external-downloader-args '-d ./ -x 10' URL_HERE
和ffmpeg
可以从 STDIN/管道读取,-i pipe:
或者甚至-i -
......例如像这样:
... | ffmpeg -i pipe: -codec:a libmp3lame -b:a 22050 -ac 1 -ar 22050 converted_audio.mp3
因此,你可以尝试这样的方法:
yt-dlp -o - -f 139 --external-downloader aria2c --external-downloader-args '-d ./ -x 10' URL_HERE | ffmpeg -i pipe: -codec:a libmp3lame -b:a 22050 -ac 1 -ar 22050 converted_audio.mp3
答案2
yt-dlp -o - -f 139 --external-downloader aria2c --external-downloader-args '-d ./ -x 10' https://www.youtube.com/watch?v=2ZrWHtvSog4 | ffmpeg -i pipe: -codec:a libmp3lame -b:a 8000 -ac 1 -ar 8000 -f mp3 "$(basename "$(yt-dlp -e https://www.youtube.com/watch?v=2ZrWHtvSog4 | sed 's/[\/:*?"<>|]/_/g')").mp3"
要使用与 相同的管道输出文件名作为输入名称ffmpeg
,可以按如下方式修改命令:
yt-dlp -o - -f 139 --external-downloader aria2c --external-downloader-args '-d ./ -x 10' https://www.youtube.com/watch?v=2ZrWHtvSog4 | ffmpeg -i pipe: -codec:a libmp3lame -b:a 8000 -ac 1 -ar 8000 -f mp3 "$(basename "$(yt-dlp -e https://www.youtube.com/watch?v=2ZrWHtvSog4 | sed 's/[\/:*?"<>|]/_/g')").mp3"
解释:
- 该
basename
命令用于从 URL 中提取基本名称。它使用 检索视频标题yt-dlp -e https://www.youtube.com/watch?v=2ZrWHtvSog4
,然后使用 将文件名中不允许的任何字符替换为下划线sed 's/[\/:*?"<>|]/_/g'
。 - 该
$(...)
语法用于执行命令并将其输出用作更大命令的一部分。 $(basename "$(yt-dlp -e https://www.youtube.com/watch?v=2ZrWHtvSog4 | sed 's/[\/:*?"<>|]/_/g')").mp3
是添加了扩展名的结果文件名.mp3
。