Board logo

标题: [文件操作] 批处理怎样调用ffmpeg封装mp4和m4a文件? [打印本页]

作者: joannec    时间: 2014-9-28 21:48     标题: 批处理怎样调用ffmpeg封装mp4和m4a文件?

想把同目录下的 mp4和m4a文件 用 ffmpeg封装成新的mp4文件,然后删除旧的mp4和m4a ,大家帮我看下代码:
  1. @ECHO OFF & CD/D "%~dp0"
  2. title 封装
  3. cls
  4. ffmpeg -i "%~dpn1_v.mp4" -vcodec copy -i "%~dpn1_a.m4a" -acodec copy "%~dpn1_output.mp4"
  5. IF EXIST "%~dpn1_output.mp4" (
  6. DEL "%~dpn1_v.mp4"
  7. DEL "%~dpn1_a.m4a"
  8. cls
  9. echo 封装完成
  10. )
  11. pause
复制代码
不知道哪里错误了,老是这个提示,要把那个 %~dpn1 改成和文件一样的名字才可以,或者把文件重命名为 _v.mp4 _a.m4a 才可以
这样很麻烦啊,高手帮我看下,谢谢了,


或者帮我看下,我把文件打包了,看下在你们的电脑上能正常吗
http://pan.baidu.com/s/1gdqvHRl (18M)
作者: DAIC    时间: 2014-9-28 21:55

把 echo off 改成 echo on 看看是哪个命令在报错

另外,你是怎样执行代码的,直接双击执行?还是在命令行传一个参数给它?
作者: joannec    时间: 2014-9-28 22:05

回复 2# DAIC

双击执行也可以的,本来我是另外一个压制mp4的批处理传过来的,这步错了就停了,
我把那个改成ON,出现这样的提示,问题是不是可能是这个代码错了   %~dpn1
作者: Linuxer    时间: 2014-9-28 23:30

_v.mp4:NO such file or directory
没有此文件或目录

也就是说,你%~dpn1没有获取到值。
%~dpn1改成%~dpn0试试呢?
作者: joannec    时间: 2014-9-29 00:57

回复 4# Linuxer

这里各种都改过了,,改成0变成这样,前面变成这个bat文件的名字
作者: DAIC    时间: 2014-9-29 08:57

回复 3# joannec


旧的mp4和m4a的文件名分别是什么?
你用%~dpn1_v.mp4这种格式是想表达什么意思?
作者: Linuxer    时间: 2014-9-29 09:21

回复 5# joannec


    同上,,,为什么要用%~dp1加到文件名里?,,%~dp1是动态变化的,,你带入到文件名里不知道是要获取什么名字?,,
作者: joannec    时间: 2014-9-29 10:58

回复 6# DAIC

j旧的文件名是: test_v.mp4 和 test_a.m4a ,test随便起的名,问题不是在这,

代码里 %~dpn1_v.mp4 我改成 %~dpn1.mp4也不行,他就会提示 .mp4 No such file or directory ,一定要把%~dpn1 改成绝对文件才行,很奇怪
作者: joannec    时间: 2014-9-29 10:59

回复 7# Linuxer

文件名没有%~dpn1的,这个只是放在代码里的,
作者: yu2n    时间: 2014-9-29 11:43

前提:
限定音频文件后缀为_a.m4a
限定视频文件后缀为_v.mp4
限定输出文件后缀为_output.mp4
实例:
有test项目,其名称定义为:
音频文件为 test_a.m4a
视频文件为 test_v.mp4
输出文件为 test_output.mp4
  1. @echo off
  2. title package  [m4a + mp4 -^> mp4]
  3. color 5F
  4. cls
  5. call :_package  "test"
  6. echo Done ^!
  7. pause
  8. goto :eof
  9. :_package
  10. set "project_name=%~1"
  11. set "WorkDir=%~dp0"
  12. set "WorkDir=%WorkDir:~0,-1%"
  13. set "acFile=%WorkDir%\%project_name%_a.m4a"
  14. set "vcFile=%WorkDir%\%project_name%_v.mp4"
  15. set "outFile=%WorkDir%\%project_name%_output.mp4"
  16. if not exist "%acFile%"  goto  :_error_miss_file
  17. if not exist "%vcFile%"  goto  :_error_miss_file
  18. if exist "%outFile%"  del /q /f "%outFile%"
  19. ffmpeg -i "%vcFile%" -vcodec copy -i "%acFile%" -acodec copy "%outFile%"
  20. if exist "%outFile%" (
  21. del /q /f "%vcFile%"
  22. del /q /f "%acFile%"
  23. )
  24. goto :eof
  25. goto :eof
  26. :_error_miss_file
  27.   echo Error, Miss File.
  28.   goto :eof
复制代码

作者: joannec    时间: 2014-9-29 12:00

本帖最后由 joannec 于 2014-9-29 12:02 编辑

回复 10# yu2n

这个可以搞定,就是要限定文件名为test,比如01_v.mp4就不行了
能不能改成不限定文件名的,就是只要认_v.mp4和_a.m4a,文件名随意
作者: DAIC    时间: 2014-9-29 13:04

回复 8# joannec


其实问题就在这里,%~dpn1在BAT里面有特殊含义,如果你不知道它代表什么意思就不要乱用。
一个文件夹下面只有一个mp4和一个m4a是吗?
作者: joannec    时间: 2014-9-29 13:12

本帖最后由 joannec 于 2014-9-29 13:15 编辑

回复 12# DAIC


   是的,,目录下只有一个xx_v.mp4和一个 xx_a.m4a ,是X264压制出来的文件,xx是avs的文件名,所以它压制出来叫xx_v.mp4
讲的好乱啊,,哈哈,,现在只要能装起来,删掉旧文件就行,
作者: DAIC    时间: 2014-9-29 13:28

  1. @echo off
  2. title 封装
  3. cls
  4. pushd "%~dp0"
  5. ffmpeg -i "*_v.mp4" -vcodec copy -i "*_a.m4a" -acodec copy "output.mp4"
  6. if exist "output.mp4" (
  7.     del /f /q "*_v.mp4" "*_a.m4a"
  8.     cls
  9.     echo 封装完成
  10. )
  11. pause
复制代码

作者: joannec    时间: 2014-9-29 13:50

回复 14# DAIC


好用,,感谢啊,哥们,,!

被这个%~dpn1搞死了,




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