2016-12-24 82 views
2

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

所以我试图用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_MP3?
echo“%(title)s。%(ext)s”给出逐字输出,不给出输出文件名。

我们如何使脚本工作?

帮助将不胜感激。

+1

1.创建一个输出文件youtube-dl,你不能将'-i'值作为'ffmpeg'吗? 2.你可以解析'ffmpeg -i file 2> 1 |的输出grep -i标题“来提取嵌入在文件中的标题名称。或者查看'ffmpeg -i file'的输出来查看是否有不同的键值提供您需要的数据。这可能会有所帮助,如果你添加一些小样本期望的文件名等你的问题。祝你好运。 – shellter

+0

我正试着指出一个方向,可以帮助你回答你的问题。你需要先决定是否ffmpeg -i file 2>&1 | grep -i title'生产任何有用的东西。如果显示的是你想要使用的确切值,那么我认为你的意思是'OUTPUT_MP3 = $(ffmpeg -i file 2>&1 | grep -i title'。否则你需要用有用的示例数据来提高你的Q值。 – shellter

+0

@shellter我只在从youtube-dl创建输出文件名后,例如hello.mp3,但是,我不知道在脚本中。 –

回答

4

youtube-dl支持--get-filename选项,该选项实际上并不下载任何内容,但在stdout上给出了计算出的文件名。

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}" 
} 
+0

但是,谢谢,当我尝试mytrim https://www.youtube.com/watch?v=dD5RgCf1hrI 30,我得到了错误Bash教程1 - 你好World.webm:没有这样的文件或目录。它失败。 –

+0

@BhishanPoudel:如果你做'mytrim“youtube.com/watch ...”'会发生什么? (使用dbl引号围绕您的文件名)。祝你好运。 – shellter

+0

@BhishanPoudel这听起来像是复制粘贴错误(或者你正在使用过时的'youtube-dl'脚本 - 我的版本是'2016.12.01') –

1

非常感谢@umlaute,
我添加以下功能到我的.bash_profile:

# 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