Board logo

标题: [文件操作] [已解决]批处理怎样利用ffmpeg合并mp3文件 [打印本页]

作者: qd2024    时间: 2023-7-27 10:33     标题: [已解决]批处理怎样利用ffmpeg合并mp3文件

本帖最后由 qd2024 于 2023-7-28 22:41 编辑

当前目录下有若干文件夹,每个文件夹时有若干MP3文件,每个文件里的MP3文件名前都有4位自然数编号

想以每个文件夹为单位,以自然数编号为顺序,把每个文件夹里的所有MP3文件合并为一个MP3文件,
新生成的MP3文件文件名与对应的文件夹名相同,
新生成的MP3文件与BAT文件放在同一级目录下。


举例文件
链接:https://pan.baidu.com/s/1l4Gw_QlPD9JHCbiAx-rV8w?pwd=gxi1
提取码:gxi1
--来自百度网盘超级会员V9的分享


感谢
作者: 77七    时间: 2023-7-27 11:07

  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式,需要ffmpeg
  4. for /d %%d in (*) do (
  5. pushd "%%d"
  6. (for /f "delims=" %%i in ('dir /b /a-d *.mp3 ^|sort') do (
  7. echo file '%%~fi'
  8. ))>xxx.txt
  9. if exist xxx.txt if not exist "%~dp0%%~nxd.mp3" (
  10. "%~dp0ffmpeg.exe" -f concat -safe 0 -i xxx.txt -c copy "%~dp0%%~nxd.mp3"
  11. )
  12. del xxx.txt 2>nul
  13. popd
  14. )
  15. pause
复制代码

作者: qd2024    时间: 2023-7-27 11:22

回复 2# 77七


    感谢
作者: qd2024    时间: 2023-7-27 11:55

回复 2# 77七


    好像是因为文件名里有特殊字符  合并过程 终止了  合并的不完整

帮忙修改一下  谢谢



举例文件
链接:https://pan.baidu.com/s/1l4Gw_QlPD9JHCbiAx-rV8w?pwd=gxi1
提取码:gxi1
--来自百度网盘超级会员V9的分享
作者: 77七    时间: 2023-7-27 13:02

回复 4# qd2024


   文件名
  1. 0106do①s⑶(1)
  2. 0040to①s⑴(1)
  3. 0015I'm=I am(1)
复制代码


太特殊了,我不会处理
只能重命名。
以下代码执行完第一个,再执行第二个,注意编码格式。
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. setlocal enabledelayedexpansion
  4. for /d %%d in (*) do (
  5. robocopy "%%d" "%%d-copy" *.mp3
  6. pushd "%%d-copy"
  7. set n=100000
  8. (for /f "delims=" %%i in ('dir /b /a-d *.mp3 ^|sort') do (
  9. set /a n+=1
  10. ren "%%i" "!n:~-5!.mp3"
  11. echo file '!n:~-5!.mp3'
  12. ))>xxx.txt
  13. popd
  14. )
  15. exit
复制代码


  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式,需要ffmpeg
  4. for /f "delims=" %%d in ('dir /b /ad ^|find /v "-copy"') do (
  5. pushd "%%d-copy"
  6. if exist xxx.txt if not exist "%~dp0%%~nxd.mp3" (
  7. ffmpeg -f concat -safe 0 -i xxx.txt -c copy "%~dp0%%~nxd.mp3"
  8. )
  9. del xxx.txt 2>nul
  10. popd
  11. rd /s /q "%%d-copy"
  12. )
  13. pause
复制代码

作者: 77七    时间: 2023-7-27 13:13

ffmpeg 改为 "%~dp0ffmpeg.exe"
经常用的话,可以添加到计算机的环境变量
作者: qd2024    时间: 2023-7-27 16:31

回复 6# 77七


    辛苦了  我试试
作者: qd2024    时间: 2023-7-27 16:54

本帖最后由 qd2024 于 2023-7-27 16:59 编辑

回复 5# 77七


    我推断是因为有特殊除号的原因,造成
             这一步  http://www.bathome.net/thread-66889-1-1.html
        还有这一步 http://www.bathome.net/thread-66899-1-1.html     

      这两步生成后文件都有丢失,

能不能这样,先清除当前目录及子目录下所有MP3文件文件名中的特殊符号,再执行

  http://www.bathome.net/redirect. ... 6899&pid=271596这个代码     因为每个文件夹内的文件都有4位编号,所以文件顺序不会乱

特殊符号包括,“半角空格 … ?. , ' = ① ② ③ ④ ⑤ ⑥ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂”
目前想到的是这些,在引号中用半角空格分开,如果再有新的,我再手动处理。


或者可以把MP3文件改名,不是重新生成,而是直接改名,只保留前4位序号,是否可行,这样就没有特殊符号的干扰了

孩子初三了刚刚醒悟要学习,单词突击中,万分感谢
作者: 77七    时间: 2023-7-27 17:44

本帖最后由 77七 于 2023-7-27 17:53 编辑

回复 8# qd2024

  1. @echo off
  2. rem http://www.bathome.net/redirect.php?goto=findpost&ptid=63860&pid=259594
  3. rem 删除当前目录及子目录下 所有文件夹名、文件名中的符号; “_”、“-”、“.” 这三个除外,我自己瞎改的。
  4. powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\s\-\w\.]')}"
  5. exit
复制代码


那就使用原始代码好了,每次先使用上面的代码清除文件(夹)名称中的符号。忽略报错信息。
作者: qd2024    时间: 2023-7-27 18:04

本帖最后由 qd2024 于 2023-7-27 18:08 编辑

回复 9# 77七


     “_”、“-”、“.” 这三个除外,我自己瞎改的。    这个是什么意思  没明白


运行报错    我没有弄明白  截图放百度盘了
举例文件
链接:https://pan.baidu.com/s/1l4Gw_QlPD9JHCbiAx-rV8w?pwd=gxi1
提取码:gxi1
--来自百度网盘超级会员V9的分享
作者: 77七    时间: 2023-7-27 18:13

回复 10# qd2024


   
直接使用就行,忽略报错信息
作者: qd2024    时间: 2023-7-27 19:13

本帖最后由 qd2024 于 2023-7-27 19:40 编辑

回复 11# 77七


    powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\s\-\w]')}"

我把后面的.删除了  但是扩展名里的.也没了

怎样才能不改名扩展名


特殊符号还有" ( "  ")"

------------
sb. can't wait      类似的 .'没用被删除
作者: 77七    时间: 2023-7-27 19:47

回复 12# qd2024


   
我测试9楼的代码,正常删除 " ( "  ")",重复执行试试。
作者: qd2024    时间: 2023-7-27 20:00

回复 13# 77七


    检查了一下  是我的原始文件出错了  我再试试
作者: qd2024    时间: 2023-7-28 08:11

本帖最后由 qd2024 于 2023-7-28 08:37 编辑

回复 13# 77七


0108take part in sth.
0100take sb.s temperature
0129cant help doing sth.

帮我想个办法,让9楼代码,在执行时,删除文件名中的“.”,比如sb.  sth.后面的点,
目前发现 只要单个文件中有“.”,执行合并文件后,对应该的单词短语音频就会重复好几遍,而且音频会变调。

在进行中英文合并时,不能把单个单词的英文和中文音频合并成一个文件,只提取到了英文的音频。

我放文件到百度盘了
链接:https://pan.baidu.com/s/1l4Gw_QlPD9JHCbiAx-rV8w?pwd=gxi1
提取码:gxi1
--来自百度网盘超级会员V9的分享

=============================
再帮我看看这个 文件变静音。
http://www.bathome.net/viewthread.php?tid=66911&extra=
感谢
作者: 77七    时间: 2023-7-28 10:36

本帖最后由 77七 于 2023-7-28 10:38 编辑

回复 15# qd2024


   
没想到点号对于ffmpeg还有影响。
  1. @echo off
  2. rem 当前目录下的子目录中只存在mp3文件,用于去除所有符号,不含 “-_” 及扩展名中的点号
  3. for /d %%d in (*) do (
  4.         pushd "%%d"
  5.         ren "*.mp3" "*."
  6.         powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\s\-\w]')}"
  7.         ren "*" "*.mp3"
  8.         popd
  9. )
复制代码

作者: wanghan519    时间: 2023-7-28 10:49

回复 15# qd2024


    只是改名,但我觉得影响执行的应该不是点,反而是空格括号之类的。。。
  1. dir *.txt | Rename-Item -NewName {($_.BaseName -replace '[ .]','')+$_.Extension}
复制代码

作者: qd2024    时间: 2023-7-28 10:56

回复 16# 77七


    不知道什么原因 测试文件  合并后  只有0145black-and-white这个合并后 英文中文都能播放  其他的几个文件  只能播放英文    把文件放到音频编辑软件后   发现有中文的部分  但音波播放时变声了
  尝试把文件名中的空格变成“-”或删除  还是这样

辛苦 帮忙分析一下原因
作者: 77七    时间: 2023-7-28 11:35

回复 18# qd2024


   ffmpeg对于音视频的处理比较粗糙,如果不行,得寻找更专业的软件,或者高明的代码处理,得专业的人来干。
作者: qd2024    时间: 2023-7-28 11:49

本帖最后由 qd2024 于 2023-7-28 12:00 编辑

回复 19# 77七


    好  能用ffmpeg统一当前目录(含子目录)下所有mp3文件的比特率吗?  比如统一到128

我对比了 出错的文件 比特率都不是128   因为 我手里大部分的都是128

帮我研究一下 用ffmpeg调整比特率  如果是128的就忽略,如果不是就调整到128

十分感谢
作者: 77七    时间: 2023-7-28 12:42

回复 20# qd2024


  
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式,需要ffmpeg ffprobe,自行修改相关路径
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.mp3') do (
  5. for /f "tokens=1-2 delims==" %%a in ('ffprobe -loglevel 0 -show_streams "%%i" ^|findstr /bc:"bit_rate="') do (
  6. if not "%%b" equ "128000" (
  7. ffmpeg -i "%%i" -ab 128k "xxx.mp3"
  8. move /y "xxx.mp3" "%%i"
  9. )
  10. )
  11. )
  12. pause
复制代码

作者: Batcher    时间: 2023-7-28 13:47

回复 8# qd2024


MP3文件改名只保留前4位序号.bat
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.mp3') do (
  5.     set "OldName=%%~ni"
  6.     set "NewName=!OldName:~0,4!%%~xi"
  7.     ren "%%i" "!NewName!"
  8. )
复制代码

作者: qd2024    时间: 2023-7-28 14:30

回复 21# 77七


    还是不行 刚刚查了之前的代码  有一个位置  设置的是44100   这个是采样率吧
      我在Adobe Audition中 把几个有问题的MP3调整采样率到44100  再进行后面的操作 就可以顺利进行了

     还是不知道其他文件什么时假会有问题  再帮我看看 ffmpeg ffprobe 能不能实现 批量查找采样率  把不是44100的改成44100

感谢
作者: 77七    时间: 2023-7-28 15:34

本帖最后由 77七 于 2023-8-7 00:50 编辑

回复 23# qd2024


  
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式,需要ffmpeg ffprobe,自行修改相关路径
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.mp3') do (
  5.         setlocal enabledelayedexpansion
  6.         ffprobe -loglevel 0 -show_streams "%%i" |findstr /xc:"bit_rate=128000" 1>nul || set str1=-ab 128k
  7.         ffprobe -loglevel 0 -show_streams "%%i" |findstr /xc:"sample_rate=44100" 1>nul || set str2=-ar 44100
  8.         if not defined str1 if not defined str2 (
  9.                 ver >nul
  10.         ) else (
  11.                 ffmpeg -i "%%i" !str1! !str2! "xxx.mp3"
  12.                 move /y "xxx.mp3" "%%i"
  13.         )
  14.         endlocal
  15. )
  16. pause
复制代码
20230807 修改一下 if not if not 这个不太规范,逻辑可能有时候会出问题。
  1. @echo off
  2. chcp 65001 >nul
  3. rem 批处理保存为utf-8编码格式,需要ffmpeg ffprobe,自行修改相关路径
  4. for /f "delims=" %%i in ('dir /b /s /a-d *.mp3') do (
  5. setlocal enabledelayedexpansion
  6. ffprobe -loglevel 0 -show_streams "%%i" |findstr /xc:"bit_rate=128000" 1>nul || set str1=-ab 128k
  7. ffprobe -loglevel 0 -show_streams "%%i" |findstr /xc:"sample_rate=44100" 1>nul || set str2=-ar 44100
  8. if "!str1!!str2!" neq "" (
  9. ffmpeg -i "%%i" !str1! !str2! "xxx.mp3"
  10. move /y "xxx.mp3" "%%i"
  11. )
  12. endlocal
  13. )
  14. pause
复制代码

作者: qd2024    时间: 2023-7-28 19:53

回复 24# 77七


    测试成功 所有问题都已解决  孩子已经开始使用练习 万分感谢
作者: 77七    时间: 2023-7-28 20:26

紧急通知:问题解决后,请不要大肆修改提问帖
最近几天,发现一些会员喜欢在问题解决后,大肆修改提问帖,甚至要求管理层删帖,这一行为影响十分恶劣:论坛所有的帖子,无论当初的问题有多么简单,都会给后来者以学习的机会,它们都是论坛宝贵的资料;如果大家在问题解决之后,把帖子修改得面目全非,甚至要求删帖,不仅是对跟帖者极大的不尊重,还会造成学习资料的破坏——如果大家都把帖子删掉,论坛还能剩下什么可供学习的资料呢?

作者: qd2024    时间: 2023-7-28 22:43

回复 26# 77七


    问题已经修正。
作者: qd2024    时间: 2023-7-29 12:56

回复 16# 77七


    你好 有没有什么办法  再转换完成后,将文件名中去掉的特殊符号再加回来。谢谢。
作者: 77七    时间: 2023-7-29 14:35

  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. rem 使用前先备份
  4. rem 第1次执行为备份文件名,第2次执行为恢复文件名。
  5. rem 批处理在各目录下生成一个 listx.txt 保存原始文件名。各目录下mp3文件 “序号”不变、数量不变 前提下使用。
  6. dir /b /s /a-d listx.txt 1>nul 2>&1 && goto :re
  7. for /d %%d in (*) do (
  8. pushd "%%d"
  9. (for /f "delims=" %%i in ('dir /b /a-d *.mp3 ^|sort') do (
  10. echo %%i
  11. ))>listx.txt
  12. popd
  13. )
  14. pause
  15. exit
  16. :re
  17. rem http://bbs.bathome.net/viewthread.php?tid=66400
  18. setlocal enabledelayedexpansion
  19. for /d %%d in (*) do (
  20. pushd "%%d"
  21. (for /f "delims=" %%i in ('dir /b /a-d *.mp3 ^|sort') do (
  22. set /p str=
  23. ren "%%i" "!str!"
  24. ))<"listx.txt"
  25. del "listx.txt"
  26. popd
  27. )
  28. pause
复制代码

作者: qd2024    时间: 2023-8-4 08:19

回复 29# 77七


    谢谢  有点事出门了  才回来  我测试一下 辛苦了




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