论坛首页 编程语言技术论坛

批处理的学习--ffmpeg命令行处理的进一步优化

浏览 8825 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (4)
作者 正文
   发表时间:2011-05-08   最后修改:2011-05-08
ffmpeg可以通过命令行的方式进行视频格式转换,是一个不错的软件,在php下可以使用exec函数,但是由于该函数水土不服,在windows下极容易出现未知错误,比如无法执行,权限问题等等,所以采用批处理来在windows下实现还是比较明智的.

需求:上传视频后,用php写bat文件到子目录,一个视频转化任务生成一个bat,如果转换成功(存在目标文件),则删除自身;在bat子目录之上(父目录)写一个bat,这个bat将被设置为windows计划任务来调用,并且它将自动遍历子目录下的bat执行.

1.判断文件是否存在,存在则删除自身子bat文件,避免执行过多文件导致冗余:
if NOT exist E:/testvideo/1.jpg (
E:/ffmpeg/ffmpeg.exe -i E:/testvideo/1.flv -y -ss 00:00:09 -t 00:00:10 -s 320*240 -f mjpeg -vframes 10 E:/testvideo/1.jpg
)
ELSE(
del %0
)

del %0 就是删除子bat自身.

2.父bat遍历子目录:
for /r E:/bat/child/ %%i in (*.bat) do call %%i

其中E:/bat/child/ 既是子bat所在目录.遍历并且执行,就可以了.
   发表时间:2011-05-08  
这样批处理必然带来的一个问题:安全.
假如有人恶作剧,del服务器文件或者 format ,该如何防御?
0 请登录后投票
   发表时间:2011-05-09  
这种写法真是神人...lz赶紧回家翻翻dos bat用法吧
0 请登录后投票
   发表时间:2011-05-09  
楼上指教下?
0 请登录后投票
   发表时间:2011-05-09   最后修改:2011-05-10
什么父父子子的bat,用一个bat就结了

@echo off

:set_env
if "" == "%FFMPEG_DIR%" set FFMPEG_DIR=E:\ffmpeg
if  "" == "%FFMPEG_PARAM%" set FFMPEG_PARAM=-y -ss 00:00:09 -t 00:00:10 -s 320*240 -f -i mjpeg -vframes 10 -i

:check_argu
if not "%1" == "" (
set FLV_ROOT=%1
) else (
set FLV_ROOT=E:\balabala
)

:exec
for /r %FLV_ROOT% %%i in (*.flv) do (
  if NOT exist %%~di%%~pi%%~ni.jpg (  
   %FFMP_DIR%\ffmpeg.exe  %FFMPEG_PARAM% %%i  %%~di%%~pi%%~ni.jpg
   rem 这里应该加入生成log
)
)

:end

 

0 请登录后投票
   发表时间:2011-05-09  
您可能不了解项目需求呢.
视频是不定时的通过网站上传的.
而且您的代码是否涉嫌耗费资源呢.
我的 父bat 是一分钟执行一次的.您是不是要每隔一分钟去扫描一次系统文件?
所以我认为生成子bat是一个不错的方法.一旦确认文件生成成功,那么删除自身,下一次就不会再遍历了.
语法上虽有欠缺没有您写的那么高级,不过我写的通俗易懂些,不是吗?
0 请登录后投票
   发表时间:2011-05-10   最后修改:2011-05-10
化蝶自在飞 写道
您可能不了解项目需求呢.
视频是不定时的通过网站上传的.
而且您的代码是否涉嫌耗费资源呢.
我的 父bat 是一分钟执行一次的.您是不是要每隔一分钟去扫描一次系统文件?
所以我认为生成子bat是一个不错的方法.一旦确认文件生成成功,那么删除自身,下一次就不会再遍历了.
语法上虽有欠缺没有您写的那么高级,不过我写的通俗易懂些,不是吗?



如果上传的时候就知道flv文件的路径,那只需要如下调用上面的bat ffmpeg.bat <路径>,何必多此一举。

就是要生成子bat,也就是生成很简单一行:

call ffpmpeg.bat <路径>

这不是和明明一个for循环可以搞定的事情,你偏偏要写10遍一个道理
0 请登录后投票
   发表时间:2011-05-10  
flv的路径是组装出来的,当然可以获取到.
比如xxx.rm 的flv就是 xxx.flv, 不能累加成 xxx.rm.flv
如果用批处理来做这个的话,是否有必要呢?
子bat是php写入的,不是人肉.
bat的执行是windows计划任务做的.上传仅仅是写bat,不触发执行.
0 请登录后投票
   发表时间:2011-05-12  
程序不直接生成bat文件 而是生成一个文本文件,如格式为:
E:/testvideo/1.flv  00:00:09 00:00:10 320*240 jpeg E:/testvideo/1.jpg

你那个定时任务去读这个文件,也就不存在安全问题了
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics