Board logo

标题: [文件操作] [已解决]如何用ffmpeg批量把比特率大于192kbs的mp3文件转成128kbs的? [打印本页]

作者: pendave    时间: 2015-1-28 15:14     标题: [已解决]如何用ffmpeg批量把比特率大于192kbs的mp3文件转成128kbs的?

本帖最后由 pendave 于 2015-1-30 23:18 编辑

想批量把mp3文件转成128kbs的。

我参看了国外的帖子
http://superuser.com/questions/157366/what-is-a-good-way-to-batch-re-encode-mp3-files-from-a-higher-bitrate-to-a-lower

说可以用ffmpeg的命令行来操作 http://www.ffmpeg.org/download.html
Advanced: if you are into command lines, you can download ffmpeg and use the below command line to convert a file: ffmpeg -i source.mp3 -vn -ar 44100 -ac 2 -ab 128 -f mp3 output.mp3

If you put it into a batch file, you can convert a whole bunch at once. mine looks like this:


convert.bat
  1. set formats=*.mp3 *.mp4 *.flv
  2. set presets=-vn -ar 44100 -ac 2 -ab 128k -vol 400 -f mp3
  3. set outputext=mp3
  4. set "convert=C:\Program Files (x86)\FormatFactory\FFModules\Encoder\ffmpeg.exe"
  5. for %%g in (%formats%) do start /b /wait "" "%convert%" -i "%~dp0%%g" %presets% "%~dp0%%~ng.%outputext%" && TITLE "Converted: "%%g -y
复制代码
那个for循环我看不懂,而且我用它不能正常转换,得到的文件才89k 恐怖....

高手能帮忙改下能用的吗?谢谢啊
作者: pendave    时间: 2015-1-28 16:31

本帖最后由 pendave 于 2015-1-28 17:18 编辑

研究了下,这个代码可以用了
  1. @echo off
  2. set outputext=128kbs
  3. for  %%i in (*.mp3) do "C:\Program Files (x86)\FormatFactory\FFModules\Encoder\ffmpeg.exe" -i "%%i"  -acodec libmp3lame -ab 128k "%%~ni.%outputext%.mp3"
  4. PAUSE
复制代码
但是这个会把所有mp3都转换一遍,有的128kbs的也被重复转成128kbs的, 怎么判断一下呢,只想要bitrate 大于等于192kbs 的mp3文件才转换!

求高手!谢谢

这里看到 .bat .vbs 配合获取mp3信息的代码

http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/MS_DOS/Q_27077456.html

Batch File Read File Attributes advanced.bat
  1. @echo off
  2. setlocal
  3. set FileName=C:\test.mp3
  4. for /F "tokens=1* delims==" %%A in ('cscript getinfo.vbs "%FileName%"') do set _prop_%%A=%%B
  5. set _prop
复制代码
getinfo.vbs
  1. if (WScript.Arguments.Count > 0) Then
  2.   strFile = WScript.Arguments(0)
  3. Else
  4.   WScript.Echo "ERROR : No input filename specified."
  5.   WScript.Quit -1
  6. End If
  7. Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
  8. If Not objFSO.FileExists(strFile) then
  9.   WScript.Echo "ERROR : Input filename specified does not exist."
  10.   WScript.Quit -1
  11. End If
  12. Set objFile = objFSO.GetFile(strFile)
  13. strFolder = objFile.ParentFolder
  14. Dim strAttrName(300)
  15. Set objShell = CreateObject("Shell.Application")
  16. Set objFolder = objShell.NameSpace(strFolder)
  17. for N = 0 To 300
  18.    strAttrName(N) = Replace(objFolder.GetDetailsOf(Nothing, N), " ", "_")
  19. Next
  20. Set objFileItem = objFolder.ParseName(objFile.Name)
  21. For i = 0 To 300
  22.    if objFolder.GetDetailsOf(objFileItem, i) <> "" Then
  23.       If Instr("objFolder.GetDetailsOf(objFileItem, i)", Chr(63)) then Wscript.Echo "FOUND"
  24.       WScript.Echo strAttrName(i) & "=" & Replace(objFolder.GetDetailsOf(objFileItem, i), Chr(63), "")
  25.    End If
  26. Next
  27. Wscript.Quit 0
复制代码

作者: apang    时间: 2015-1-28 21:53

本帖最后由 apang 于 2015-1-29 11:11 编辑

自己改下
  1. @set @n=0;/* & echo off
  2. for /f "delims=" %%i in ('dir/b *.mp3^|cscript -nologo -e:jscript "%~0"')do (
  3.         echo,%%i
  4. )
  5. pause & exit/b & rem */
  6. fd = WScript.ScriptFullName.match(/^(.*)\\/)[1];
  7. objShell = new ActiveXObject("Shell.Application");
  8. objFolder = objShell.NameSpace(fd);
  9. i = 0;
  10. while (true) {
  11.         strAttrName = objFolder.GetDetailsOf(null, i);
  12.         if (strAttrName == "比特率" || strAttrName == "位速") {
  13.                 break;
  14.         } else i++
  15. }
  16. while (!WScript.StdIn.AtEndOfStream) {
  17.         f = WScript.StdIn.ReadLine();
  18.         objFolderItem = objFolder.ParseName(f);
  19.         bitRate = objFolder.GetDetailsOf(objFolderItem, i);
  20.         if (bitRate.match(/\d+/)[0] >= 128) WScript.Echo(f);
  21.         //大于等于 128 kbps
  22. }
复制代码

作者: pendave    时间: 2015-1-29 00:00

回复 3# apang

为啥我用
  1. set "encode=C:\Program Files (x86)\FormatFactory\FFModules\Encoder\ffmpeg.exe"
复制代码
运行就会报错:
此时不应有 \FormatFactory\FFModules\Encoder\ffmpeg.exe。


我都只好用这种形式,不过太长了
  1. "C:\Program Files (x86)\FormatFactory\FFModules\Encoder\ffmpeg.exe" -i "%%i"  -acodec libmp3lame -ab 128k "%%~ni.%outputext%.mp3"
复制代码
这个是bug吗?
作者: hfg1977    时间: 2015-1-29 09:59

foobar采用LAME编解码,支持多种码率批量转换。
喜欢音乐的没几个不用吧。 建议你试试。
当然批处理还要好好学。
作者: DAIC    时间: 2015-1-31 04:27

回复 4# pendave


    报错的原因可能是双引号没加对地方,完整代码发出来看看。
作者: pendave    时间: 2015-1-31 16:31

回复 5# hfg1977

LAME编解码 我昨天试了下,差不多的

http://www.rarewares.org/mp3-lame-bundle.php

在这里下 lame.exe 包
作者: pendave    时间: 2015-1-31 16:32

回复 6# DAIC

我用了 就好了
  1. set encode="C:\Program Files (x86)\FormatFactory\FFModules\Encoder\ffmpeg.exe"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2