最近开发中用到ffmpeg做转码,最简单的办法就是应用匿名管道技术了。通过管道的重定向功能,将ffmpeg的转码输出信息重定向到管道,在程序中读取该管道信息进行分析即可。
但是在调试中发现一个问题,当给ffmpeg的命令行字符串中包含带有空格的路径时,ffmpeg执行会失败,提示找不到对应的路径或文件。
相信这个问题在一些其他的命令行工具上也会碰到,在这里给出两个常用的解决方法。
一、使用短路径(8.3文件名)
这种方案可以完美解决路径中带有空格和特殊字符的情形,但是实现起来可能会遇到点小麻烦,下面具体说明。
1、8.3文件名
8.3格式是DOS下的文件命名规则,规定主文件名不能超过8个字符(若是汉字则不能超过4个汉字),扩展名不能超过3个字符,中间用'.'分隔。
现在Windows已经支持最多255个字符的长文件名,但是为了兼容还会以8.3格式生成短文件名。
8.3文件名生成的具体规则为:
- 删除文件名中的空格和无效字符,无效字符包括:. " / \ [ ] : ; = ,
- 取文件名的前6个字符,加上~1,如果遇到前六个字符相同的文件名,依次用~2、~3...
- 取文件名最后一个点号'.'分割主文件名和扩展名,如果点号'.'后面没有字符,则尝试取前一个点号'.'
- 将原文件扩展名截断为3个字符甚至更短
- 将主文件名及扩展名中的所有字符转为大写
2、长文件名到短文件名转换
Windows提供了长文件名到短文件名的转换API函数GetShortPathName,使用起来非常方便。但是有一个问题,就是该函数会自动检查需要转换的长文件名对应的文件是否存在,如果不存在将返回错误。这样当我们企图给ffmpeg设置转码输出文件的时候,由于转换文件名的时候输出文件还不存在,转换就会失败。
因此要想真正实现此方案需要自己实现长文件名到短文件名的转换函数,可能实现起来还是不那么方便。
二、给路径加上引号
比较起来这种方案更加简单有效,只需给带有空格的路径外面加上双引号就可以了。比如路径"C:\Program
Files\Microsoft Visual Studio 8",只需要变为""C:\Program Files\Microsoft
Visual Studio 8""就可以了。
这种方法也是在DOS环境下经常用到的方法。
加载中,请稍候......