2016-01-13 41 views
1

短故事:我想写一个脚本,将使用FFmpeg将存储在一个目录中的许多文件转换为“标准”mp4格式并将转换后的文件保存在另一个目录中。这是一种学习体验(一种有趣的体验!),因为我没有做过任何真正的编码,因为在IBM 370主机上使用Pascal和FORTRAN很流行。传递脚本变量的文件名与空格在外部程序(ffmpeg)bash中失败

本质上,脚本获取文件名,剥离路径和扩展名,用路径和mp4扩展名重新组合文件名,并用一些设置参数调用FFmpeg来完成转换。如果该目录仅包含名称中没有空格的视频文件,则一切正常。如果文件名包含空格,则FFmpeg无法处理该文件并转到下一个文件。错误表明FFMpeg只能看到文件名到第一个空格。我在下面包含脚本和输出。

感谢您的任何帮助和建议。如果你认为我应该以另一种方式来做这件事,请采取一切手段,给我你的建议。正如我所说,我做了这样的事情已经很长时间了。虽然我很享受。

我已经包含代码第一,然后是示例输出。

for file in ./TBC/*.mp4 
    do 

    echo "Start of iteration" 
    echo "Full text of file name:" $file 

    #Remove everything up to "C/" (filename without path) 
    fn_orig=${file#*C/} 
    echo "Original file name:" $fn_orig 

    #Length of file name 
    fn_len=${#fn_orig} 
    echo "Filename Length:" $fn_len 

    #file name without path or extension 
    fn_base=${fn_orig:0:$fn_len-4} 
    echo "Base file name:" $fn_base 

    #new filename suffix 
    newsuffix=".conv.mp4" 

    fn_out=./CONV/$fn_base$newsuffix 
    echo "Converted file name:" $fn_out 

    ffmpeg -i $file -metadata title="$fn_orig" -c:v libx264 -c:a libfdk_aac -b:a 128k $fn_out 

    echo "End of iteration" 
    echo 
    done 
echo "Script completed" 

随着注释掉ffmpeg的线,并在./TBC目录两个文件,这是输出,我得到

Start of iteration 
    Full text of file name: ./TBC/Test file with spaces.mp4 
    Original filename: Test file with spaces.mp4 
    Filename Length: 25 
    Base filename: Test file with spaces 
    Converted file name: ./CONV/Test file with spaces.conv.mp4 
    End of iteration 

    Start of iteration 
    Full text of file name: ./TBC/Test_file_with_NO_spaces.mp4 
    Original file name: Test_file_with_NO_spaces.mp4 
    Filename Length: 28 
    Base file name: Test_file_with_NO_spaces 
    Converted file name: ./CONV/Test_file_with_NO_spaces.conv.mp4 
    End of iteration 

    Script completed 

我不会打扰张贴结果时ffmpeg的是取消注释,除了声明它失败并显示以下错误: ./TBC/Test:没有这样的文件或目录

然后,脚本继续到下一个成功完成的文件,因为它的名称中没有空格。实际的文件名是“带有spaces.mp4的测试文件”,所以你可以看到ffmpeg在遇到空格时停在“测试”一词后面。

我希望这个清晰简明,希望有人能够指引我正确的方向。还有很多我想要处理的脚本,比如解析子目录和忽略非视频文件等。

我期待着您能给予的任何见解!

+0

提问时;尽量减少!这是太多的文本和代码才能得到真正的问题! –

+1

你试过我的回答吗?它有用吗?任何更新? –

+0

嗨,对不起......上床睡觉了。我尝试了你的想法,但它仍然无效...没有运气。有任何想法吗? – BostonScott

回答

1

尝试引用您的输出文件:

ffmpeg -i "$file" ... "$fn_out" 

bash的分离基于空格的参数,所以你要告诉他,$ fn_out是一个单独的参数;因此“”表明这是一个论点。

+0

即使使用变量周围的引号,带有空格的文件名的迭代仍会在FFmpeg中引发错误。行情似乎并不像一个单位一样。有任何想法吗? – BostonScott

+0

同样的错误? –

+0

这确实是输入字段中缺失的引号。我猜是因为它成功地从目录中读取了带有空格的文件,但没有将文件写入它,所以当它一直是导致故障的输入参数时,我开始关注输出。再次感谢你的帮助! – BostonScott