Board logo

标题: [文件操作] [已解决]批处理如何把多个文件夹下的ts分别合成mp4文件? [打印本页]

作者: lvwenjun11    时间: 2023-2-4 09:01     标题: [已解决]批处理如何把多个文件夹下的ts分别合成mp4文件?

本帖最后由 lvwenjun11 于 2023-2-4 16:41 编辑

@
  1. @echo off
  2. set "p=%cd%"??& cd ..
  3. call set "p=%%p:%cd%\=%%"
  4. call set "p=%%p:%cd%=%%"
  5. cd "%~dp0"
  6. (for %%a in (*.ts) do @echo file %%a) > Video.txt
  7. ffmpeg -f concat -i "Video.txt" -c copy "%p%.mp4"
  8. del Video.txt
  9. pause
复制代码
如上代码 分别是获取文件夹名 合成ts文件
A文件夹下有 1.ts 2.ts 3.ts
B文件夹下有4.ts 5.ts 6.ts
假设所有ts文件按顺序排列
如何生成A.mp4  B.mp4 不再枚举
其中ffmpeg已配置

附上几个很小的ts文件,大佬们可以练练手!谢谢!https://www.aliyundrive.com/s/NBw67uLXZVc
版主大大的第二段代码可以使用!谢谢!
作者: lvwenjun11    时间: 2023-2-4 09:05

本帖最后由 lvwenjun11 于 2023-2-4 16:37 编辑

前排谢谢各位大佬!
作者: Batcher    时间: 2023-2-4 09:15

回复 1# lvwenjun11
  1. @echo off
  2. cd /d "%~dp0"
  3. set "TmpFile=Video.txt"
  4. for /f "delims=" %%i in ('dir /b /ad') do (
  5.     echo 正在处理文件夹:%%i
  6.     pushd "%%i"
  7.     (for %%a in (*.ts) do echo file %%a) > "%TmpFile%"
  8.     ffmpeg -f concat -i "%TmpFile%" -c copy "%%~nxi.mp4"
  9.     del /f /q "%TmpFile%"
  10.     popd
  11. )
复制代码

作者: lvwenjun11    时间: 2023-2-4 09:20

回复 3# Batcher


    大佬你好 复制粘贴一下发现没法运行
作者: lvwenjun11    时间: 2023-2-4 09:23

回复 3# Batcher


    http://www.bathome.net/viewthread.php?tid=62412&highlight=ts
大佬您看下这段代码 他是分别转换但没合并 能优化下嘛
作者: Batcher    时间: 2023-2-4 09:24

回复 4# lvwenjun11


请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA

如果仍有问题,请观察一下哪行代码在报错以及详细的报错信息。
如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: yakeyun    时间: 2023-2-4 09:40

本帖最后由 yakeyun 于 2023-2-4 09:46 编辑

回复 1# lvwenjun11


[分享]批处理一键执行M3U8视频转码合并 - BAT求助&讨论 - 批处理之家 批处理_BAT脚本_PowerShell_VBS_CMD_DOS_Perl_Python - Powered by Discuz!  http://www.bathome.net/thread-62860-1-1.html

可以参考下,这个是对单个视频文件批量处理的代码。如果要批量处理多个视频,就需要修改代码,以最终子目录为目标,先输出子目录名录到文本,然后逐一读取对应子目录处理。批处理放到TS文件夹外层目录下运行:
  1. @echo off
  2. title M3U8视频转换合并工具v1.1 By.sanli
  3. cd /d "%~dp0"
  4. if not exist %SystemRoot%\System32\ffmpeg.exe (curl -O http://bcn.bathome.net/tool/ffmpeg,4.3/ffmpeg.exe & move /y "ffmpeg.exe" "%SystemRoot%\System32\ffmpeg.exe")
  5. if not exist %SystemRoot%\System32\ffmpeg.exe (mshta "vbscript:msgbox("当前网络不可用,无法继续执行!",0,"提醒:") & window.close" & exit )
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%a in ("%cd%") do set name=%%~na
  8. for /f "tokens=* delims=, " %%a in ('dir /a /s /b .\*.ts') do (
  9. ffmpeg -i "%%a" -threads 4 -f mp4 -codec copy "000%%~na.mp4"
  10. )
  11. (
  12. for /f "tokens=* delims=, " %%a in ('dir /a /s /b .\*.mp4') do (
  13. echo %%~nxa
  14. )
  15. )>del.txt
  16. (
  17. for /f "tokens=* delims=, " %%a in ('dir /a /s /b .\*.mp4') do (
  18. echo file '%%~nxa'
  19. )
  20. )>config.txt
  21. ffmpeg -f concat -i config.txt -c copy output.mp4
  22. ren output.mp4 "!name!.mp4"
  23. for /f %%a in (del.txt) do (
  24. del %%a
  25. )
  26. if exist del.txt (del del.txt)
  27. if exist config.txt (del config.txt)
  28. exit
复制代码

作者: lvwenjun11    时间: 2023-2-4 09:53

回复 7# yakeyun


   大佬劳烦您能优化下嘛  放在单个子目录里我参照网上的改好了 但是放到父目录里我一点头绪没有
作者: Batcher    时间: 2023-2-4 09:57

回复 1# lvwenjun11
  1. @echo off
  2. REM 根据自己电脑实际情况设置ffmpeg的路径
  3. set "path=D:\BAT_Tools\ffmpeg\ffmpeg-n4.4-83-gb1f2d203c0-win64-gpl-4.4\bin;%path%"
  4. cd /d "%~dp0"
  5. set "TmpFile=Video.txt"
  6. for /f "delims=" %%i in ('dir /b /ad') do (
  7.     echo 正在处理文件夹:%%i
  8.     pushd "%%i"
  9.     (for %%a in (*.ts) do echo file %%a) > "%TmpFile%"
  10.     ffmpeg -f concat -i "%TmpFile%" -c copy "%%~nxi.mp4"
  11.     del /f /q "%TmpFile%"
  12.     popd
  13. )
复制代码

作者: lvwenjun11    时间: 2023-2-4 10:12

回复 9# Batcher


    大佬 运行不了 看错误是插入pause吗
作者: lvwenjun11    时间: 2023-2-4 12:01

  1. 正在处理文件夹:Mmmz
  2. ffmpeg version N-109748-gb92028346c-20230203 Copyright (c) 2000-2023 the FFmpeg developers
  3.   built with gcc 12.2.0 (crosstool-NG 1.25.0.90_cf9beb1)
  4.   configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-libxml2 --enable-zlib --enable-libfreetype --enable-libfribidi --enable-gmp --enable-lzma --enable-fontconfig --enable-libvorbis --enable-opencl --disable-libpulse --enable-libvmaf --disable-libxcb --disable-xlib --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-lv2 --disable-libmfx --enable-libvpl --enable-openal --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --disable-vaapi --enable-libvidstab --enable-vulkan --enable-libshaderc --enable-libplacebo --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-ldflags=-pthread --extra-ldexeflags= --extra-libs=-lgomp --extra-version=20230203
  5.   libavutil      57. 44.100 / 57. 44.100
  6.   libavcodec     59. 61.100 / 59. 61.100
  7.   libavformat    59. 37.100 / 59. 37.100
  8.   libavdevice    59.  8.101 / 59.  8.101
  9.   libavfilter     8. 56.100 /  8. 56.100
  10.   libswscale      6.  8.112 /  6.  8.112
  11.   libswresample   4.  9.100 /  4.  9.100
  12.   libpostproc    56.  7.100 / 56.  7.100
  13. [concat @ 000001bb91047880] Line 2: unknown keyword 'D:\���img\Mmmz>echo'
  14. Video.txt: Invalid data found when processing input
复制代码
回复 9# Batcher
这是错误信息 主要是最后一句
作者: 77七    时间: 2023-2-4 12:22

本帖最后由 77七 于 2023-2-4 12:23 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /s /ad') do (
  4.         pushd "%%i"
  5.         for /f "delims=" %%a in ('dir /b /a-d *.ts') do (
  6.                 echo file '%%~fa'
  7.         )>>temp.txt
  8.         if exist temp.txt (
  9.                 ffmpeg -f concat -safe 0 -i temp.txt -c copy "%%~ni.mp4"
  10.                 for /f "tokens=2 delims='" %%b in ('type "temp.txt"') do (
  11.                         del "%%b"
  12.                 )
  13.                 del temp.txt
  14.         )
  15.         popd
  16. )
  17. pause
复制代码

加了个合并后删除功能,如果数据非常重要,可以删掉,第10、11、12这三行直接删除,以防合并出现错误、或效果不理想后丢失源文件

使用前先备份
作者: lvwenjun11    时间: 2023-2-4 16:01

回复 12# 77七
有窗口出来 但是没任何动静
作者: xp3000    时间: 2023-2-4 16:10

本帖最后由 xp3000 于 2023-2-4 17:42 编辑

这个问题在于有人不知道下载的ffmpeg放哪里
ffmpeg放入C:\Windows\System32文件夹就可以了
下面这个只处理目录下一级的文件夹的ts视频
  1. @echo off&setlocal enabledelayedexpansion
  2. @REM 保存为ANSI编码,文件名排序后合并视频
  3. set s=^^^^^^^^^^^^^^^^^^^^^^^^^^
  4. for /d %%a in (*) do (echo.进入文件夹:%%a
  5.     pushd %~dp0%%a&type nul>"%%a.txt"
  6. setlocal
  7. for /f "delims=" %%i in ('dir /b/a-d/on "*.ts"') do (
  8.     set "ss=!s!!s!!s!!s!!s!%%i"&set "^^=!ss:~-64!"&set _!^^!=!^^!
  9.     )
  10. for /f "delims==_^^" %%j in ('set _^|sort /+1') do (
  11.     echo;file %%j>>"%%a.txt"&echo; 即将合并文件 %%j
  12.     )
  13. popd
  14. endlocal
  15. ffmpeg -f concat -i "%~dp0%%a\%%a.txt" -vcodec copy -acodec copy "%~dp0%%a.mp4" -y
  16. del /f /s /q "%~dp0%%a\%%a.txt" >nul 2>nul
  17. )
  18. pause
复制代码
ffmpeg后面有个-y,不需要覆盖就删除
这一个处理根目录内所有文件夹的ts视频
  1. @echo off&setlocal enabledelayedexpansion
  2. @REM 保存为ANSI编码,文件名排序后合并视频
  3. cd \
  4. set s=^^^^^^^^^^^^^^^^^^^^^^^^^^
  5. for /f "delims=" %%a in ('dir /a:d /b/s *') do (
  6.     pushd "%%a"&echo.进入"%%a"
  7. if exist *.ts (type nul>"%%a\%%~na.txt"
  8. echo.
  9. setlocal
  10. for /f "delims=" %%i in ('dir /b/a-d/on "*.ts"') do (
  11.     set "ss=!s!!s!!s!!s!!s!%%i"&set "^^=!ss:~-64!"&set _!^^!=!^^!
  12.     )
  13. for /f "delims==_^^" %%j in ('set _^|sort /+1') do (
  14.     echo;file %%j>>"%%a\%%~na.txt"&echo; 即将合并文件 %%j
  15.     )
  16. popd
  17. endlocal
  18. ffmpeg -f concat -i "%%a\%%~na.txt" -vcodec copy -acodec copy "%~dp0%%~na.mp4" -y
  19. del /f /s /q "%%a\%%~na.txt" >nul 2>nul
  20. ) else (echo %%a不存在ts视频)
  21. )
  22. pause
复制代码

作者: 77七    时间: 2023-2-4 16:19

回复 13# lvwenjun11

把代码以ansi编码格式保存为bat文件,放到需要处理的目录里面,如果目录下没有ts文件,肯定没有动静
作者: lvwenjun11    时间: 2023-2-4 16:20

回复 14# xp3000


    谢谢大佬!但是不行
作者: lvwenjun11    时间: 2023-2-4 16:31

回复 15# 77七


    看了下确实有动静。。。就是把原来的ts全删了
作者: 77七    时间: 2023-2-4 16:38

本帖最后由 77七 于 2023-2-4 16:41 编辑

回复 17# lvwenjun11

看来是ffmpeg合并失败了
   你的文件名或者路径名是不是含有特殊符号?目录下不要存在与文件夹名同名的MP4文件
作者: lvwenjun11    时间: 2023-2-4 16:43

回复 18# 77七


    没有这种情况,用九楼大大的代码重新试了一下,可以了!也非常谢谢你!
作者: 77七    时间: 2023-2-4 17:00

回复 19# lvwenjun11


  
  1. @echo off
  2. cd /d "%~dp0"
  3. rem 先设置路径ffmpeg的路径,需要引号,例如 set ffmpegexe="C:\Program Files\ffmpeg\ffmpeg.exe"
  4. set ffmpegexe=
  5. for /f "delims=" %%i in ('dir /b /s /ad') do (
  6. pushd "%%i"
  7. for /f "delims=" %%a in ('dir /b /a-d *.ts') do (
  8. echo file '%%~fa'
  9. )>>temp.txt
  10. if exist temp.txt (
  11. %ffmpegexe% -f concat -safe 0 -i temp.txt -c copy "%%~ni.mp4"
  12. for /f "tokens=2 delims='" %%b in ('type "temp.txt"') do (
  13. del "%%b"
  14. )
  15. del temp.txt
  16. )
  17. popd
  18. )
  19. pause
复制代码
你的ffmpeg应该没有添加到环境变量吧?
试一下这样呢?
作者: xp3000    时间: 2023-2-4 17:07

回复  xp3000
    谢谢大佬!但是不行
lvwenjun11 发表于 2023-2-4 16:20


原帖上面增加了一个处理整个分区的
作者: lvwenjun11    时间: 2023-2-4 17:14

回复 20# 77七


    也是不行 我添加环境变量了 用九楼的代码跑成功了,您的这个代码我又试了 有反应 但是不合成 最后清空了ts
作者: lvwenjun11    时间: 2023-2-4 17:21

回复 21# xp3000


    谢谢 这个是不是要重新设置环境变量 提示里这么说 我明明设置过了
作者: 77七    时间: 2023-2-4 17:29

回复 22# lvwenjun11


   你可以直接在命令行输入
  1. ffmpeg -h
  2. rem 或者
  3. ffmpeg -help
复制代码


试试看呢?
作者: xp3000    时间: 2023-2-4 17:31

回复 23# lvwenjun11

就是把ffmpeg放入C:\Windows\System32文件夹就可以了
作者: hlzj88    时间: 2023-2-4 18:35

在我的有限的实践中,发现 ts 文件可以直接重命名 为 mp4
例如:1  ren *.ts *.mp4
         2  type *.ts>>new.mp4  这里没有考虑先后顺序
作者: lvwenjun11    时间: 2023-2-4 18:53

回复 26# hlzj88


    谢谢 但是我还需要一个合并操作




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