使用 Shell 脚本将 mp4 转换为 mp3

Ami*_*mir 6 command-line video bash ffmpeg mp3

我已经看过转换MP4到MP3播放它使用一个叫做工具ffmpeg。当您要转换单个文件时,这个过程很棒,但我正在尝试为任何给定目录自动执行 mp4 到 mp3 转换。

例如,给出了下面的目录及其所有子目录,即 MusicVideos`:

.
??? Andra
?   ??? Andra::Why.mp4
??? Ariana Grande
?   ??? Dangerous Woman
?       ??? ArianaGrande::IntoYou.mp4
?       ??? ArianaGrande::SideToSide.mp4
??? Justin Bieber
?   ??? JustinBieber::LetMeLoveYou.mp4
??? Major Lazer
?   ??? De Maxx 37
?       ??? MajorLazer::ColdWater.mp4
??? Martin Garrix & Bebe Rexha
?   ??? MartinGarrix&BebeRevha::InTheNameOfLove.mp4
??? Shawn Mendes
?   ??? ShawnMendes::TreatYouBetter.mp4
??? Sia
?   ??? The Greatest
?       ??? Sia::TheGreatest.mp4
??? The Chainsmokers
?   ??? TheChainsmokers::AllWeKnow.mp4
?   ??? TheChainsmokers::Closer.mp4
??? The Weekend
?   ??? Starboy
?       ??? TheWeekend::DaftPunk.mp4
??? TWENTY ØNE PILØTS
    ??? Suicide Squad
        ??? TwentyOnePilots::Heathens.mp4
Run Code Online (Sandbox Code Playgroud)

脚本运行后,输出目录应如下所示,即MusicAudio

.
??? Andra
?   ??? Andra::Why.mp3
??? Ariana Grande
?   ??? Dangerous Woman
?       ??? ArianaGrande::IntoYou.mp3
?       ??? ArianaGrande::SideToSide.mp3
??? Justin Bieber
?   ??? JustinBieber::LetMeLoveYou.mp3
??? Major Lazer
?   ??? De Maxx 37
?       ??? MajorLazer::ColdWater.mp3
??? Martin Garrix & Bebe Rexha
?   ??? MartinGarrix&BebeRevha::InTheNameOfLove.mp3
??? Shawn Mendes
?   ??? ShawnMendes::TreatYouBetter.mp3
??? Sia
?   ??? The Greatest
?       ??? Sia::TheGreatest.mp3
??? The Chainsmokers
?   ??? TheChainsmokers::AllWeKnow.mp3
?   ??? TheChainsmokers::Closer.mp3
??? The Weekend
?   ??? Starboy
?       ??? TheWeekend::DaftPunk.mp3
??? TWENTY ØNE PILØTS
    ??? Suicide Squad
        ??? TwentyOnePilots::Heathens.mp3
Run Code Online (Sandbox Code Playgroud)

我正在研究如何使用 bash 脚本进行这种转换,我遇到了Script: Recursively convert wma files to MP3, then remove WMA files

这似乎比我预期的要困难一些,任何帮助和指导将不胜感激。

更新

在一些帮助下,我编写了一个脚本:请确认这有效!

cp -a /$1/. /$2/  #copy the whole dir from src to dest

#cd $2 #change dir to dest
cd $2
#convert *.mp4 to *.mp3
#find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "$dest/$var".mp3' - '{}' \;

find . -name "*.mp4" -exec bash -c 'ffmpeg -i "$1" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "${1%.mp4}".mp3' - '{}' \;

echo "Cleaning up" 
find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/}; rm "${1#*/}"' - '{}' \;
Run Code Online (Sandbox Code Playgroud)

你可以在我的GitHub 上找到源代码。任何进一步的贡献将不胜感激。

Bil*_*qar 9

首先,您需要在新的顶级目录中复制目录结构。在包含 .mp4 文件的原始顶级目录中运行find . -type d >dirs.txt. 这会将所有目录及其路径存储在dirs.txt. 然后将目录更改为新的顶级目录并运行xargs mkdir -p <dirs.txt. 这将创建与原始目录相同的目录结构。

要更改格式并将文件存储到不同的目录,请在原始顶级目录中运行以下命令。

find . -name "*.mp4" -exec bash -c 'var=${1%.mp4}; var=${var#*/};ffmpeg -i "${1#*/}" -vn -acodec libmp3lame -ac 2 -qscale:a 4 -ar 48000 "~/PATH/to/NewTopDIr/$var".mp3' - '{}' \;
Run Code Online (Sandbox Code Playgroud)

解释

find . -name "*.mp4"查找所有 .mp4 类型的文件。-exec bash -c为找到的每个文件运行后续字符串中提供的 bash 命令。它还将文件名作为$1可以在 bash 命令中使用的变量传递。

此时$1包含类似./path/file.mp4. 要删除*.mp4我们使用var=${1%.mp4}which 存储./path/file到的文件类型$var。现在我们删除前面的./var=${var#*/}因此值为$varis path/file

ffmpeg命令中,我们获取当前文件名,${var#*/}其中给出了 path/file.mp4,我们获取了输出文件,~/PATH/to/NewTopDIr/$var".mp3其中 where$var具有path/file如上所述的值。