使用 Shell 脚本将 mp4 转换为 mp3

使用 Shell 脚本将 mp4 转换为 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

脚本运行后,输出目录应如下所示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

我正在研究如何使用 bash 脚本进行这种转换,然后我遇到了脚本:递归地将 wma 文件转换为 MP3,然后删除 WMA 文件

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

更新

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

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#*/}"' - '{}' \;

您可以在我的GitHub. 任何进一步的贡献都将不胜感激。

答案1

首先,您需要在新的顶层目录中复制目录结构。在包含 .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' - '{}' \;

解释

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

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

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

相关内容