Bash:Bash脚本从youtube url下载修剪过的mp3

Bash:Bash脚本从youtube url下载修剪过的mp3,bash,ffmpeg,youtube-dl,Bash,Ffmpeg,Youtube Dl,我想从youtube的视频url下载最初经过x秒剪辑的mp3。 我发现youtube dl可以将视频从youtube下载到本地机器上。但是,当我查看youtube dl的手册页时,我找不到任何修剪选项 因此,我尝试使用ffmpeg来修剪下载的mp3文件。 我喜欢编写一个bash脚本来做同样的事情,而不是用两个步骤来完成这项工作。 下面是我的尝试 然而,我被困在一个地方: “如何从YOUTUBE-DL获取输出MP3文件的变量名?” 脚本如下所示: # trim initial x seconds

我想从youtube的视频url下载最初经过x秒剪辑的mp3。
我发现youtube dl可以将视频从youtube下载到本地机器上。但是,当我查看youtube dl的手册页时,我找不到任何修剪选项

因此,我尝试使用ffmpeg来修剪下载的mp3文件。
我喜欢编写一个bash脚本来做同样的事情,而不是用两个步骤来完成这项工作。
下面是我的尝试

然而,我被困在一个地方:
“如何从YOUTUBE-DL获取输出MP3文件的变量名?”
脚本如下所示:

# trim initial x seconds of mp3 file
# e.g. mytrim https://www.youtube.com/watch?v=dD5RgCf1hrI 30
function mytrim() {
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1
    ffmpeg -ss $2 -i $OUTPUT_MP3 -acodec copy -y temp.mp3
    mv temp.mp3 $OUTPUT_MP3
    }
如何获取变量值$OUTPUT\u MP3?
echo“%(title)s.%(ext)s”提供逐字输出,而不提供输出文件名

我们怎样才能使脚本工作


非常感谢您的帮助。

youtube dl
支持一个
--get filename
选项,该选项实际上并不下载任何内容,而是在标准输出上提供计算出的文件名

mytrim() {
    local downloaded_file
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1)
    ffmpeg -ss $2 -i "${downloaded_file}" -acodec copy -y temp.mp3
    mv temp.mp3 "${downloaded_file}"
}
非常感谢@umlaute,
我在bash_配置文件中添加了以下函数:

# download best video quality using youtube-dl
# usage: myvid https://youtu.be/450p7goxZqg?t=4
function myvid() {
  youtube-dl -f bestvideo+bestaudio "$1"
  rm -r youtube_video_time.txt
}

# usage: mymp3 youtube_video_url
mymp3() {
    local downloaded_file
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $1)
}

# initial x seconds trimmed mp3 song
# mytrim 5 https://www.youtube.com/watch?v=iLQxbEkN85o
mytrim() {
    local downloaded_file
    youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $2
    downloaded_file=$(youtube-dl --get-filename --extract-audio --embed-thumbnail --audio-format mp3 -o "%(title)s.%(ext)s" $2)
    ffmpeg -ss $1 -i "${downloaded_file}" -acodec copy -y temp.mp3
    mv temp.mp3 "${downloaded_file}"
    clear
    echo "${downloaded_file}"
    # Now replace whitespace by underscore
    find . -type f -name "* *.mp3" -exec bash -c 'mv "$0" "${0// /_}"' {} \;
    # Lowercase the file name
    for i in $(find . -name '*[A-Z]*.mp3' -type f); do mv "$i" "$(echo $i|tr A-Z a-z)"; done
}
从文本文件下载歌曲

IN_URL="/Volumes/Media/Music/download_youtube_mp3/songs.txt"
ODIR="downloaded_songs/%(title)s.%(ext)s"
youtube-dl --extract-audio --embed-thumbnail --audio-format mp3 --audio-quality=320k --output $ODIR --batch-file=$IN_URL

1.您从youtube dl创建了一个输出文件,您不能将该名称作为
-i
值传递给
ffmpeg
?2.您可以解析
ffmpeg-i file 2>1 | grep-i title
的输出,以提取嵌入文件中的标题名。或者查看
ffmpeg-i文件的输出,查看是否有不同的键值提供所需的数据。如果你在Q中添加一些小样本的预期文件名等,可能会有所帮助。祝你好运。我正试图为你指出一个方向,帮助你回答你的问题。您需要首先确定
ffmpeg-i file 2>&1 | grep-i title
是否产生了任何有用的内容。如果显示的是您想要使用的确切值,那么我认为您指的是
OUTPUT\u MP3=$(ffmpeg-i file 2>&1 | grep-i title
。否则,您需要使用有用的示例数据来提高Q。祝您好运。@Sheller我只在从youtube dl创建输出文件名后才获得输出文件名,例如hello.mp3,但我在脚本中不知道。
刚刚注意到
-o“%(title)s.%(ext)s”`“没有给出输出文件名”.Hm..这真的是vauge,我不想在20个Q上来回,所以最简单的事情就是为这个过程创建一个
/tmp
目录(即
mkdir/tmp/$$.work
),将输出保存到该目录,唯一的文件就是您想要的,根据需要重定向/移动输出到“real”目录,然后用
/bin/rm-r/tmp/$$清理。工作
。睡觉;-)祝你好运。但是,谢谢,当我尝试mytrim 30时,我遇到了错误Bash教程1-Hello World.webm:没有这样的文件或目录。它失败。@BhishanPoudel:如果你做
mytrim“youtube.com/watch…”会发生什么?(文件名周围有dbl引号)。祝你好运。@BhishanPoudel这听起来像是复制粘贴错误(或者你使用的是过时的
youtube dl
脚本-我的版本是
2016.12.01