我看过将 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#*/}
的值$var
是path/file
。
在ffmpeg
命令中,我们通过给出 path/file.mp4 来获取当前文件名,并通过where${var#*/}
来获取输出文件,其中的值如上所述。~/PATH/to/NewTopDIr/$var".mp3
$var
path/file