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 上找到源代码。任何进一步的贡献将不胜感激。
首先,您需要在新的顶级目录中复制目录结构。在包含 .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如上所述的值。