短故事:我想写一个脚本,将使用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在遇到空格时停在“测试”一词后面。
我希望这个清晰简明,希望有人能够指引我正确的方向。还有很多我想要处理的脚本,比如解析子目录和忽略非视频文件等。
我期待着您能给予的任何见解!
提问时;尽量减少!这是太多的文本和代码才能得到真正的问题! –
你试过我的回答吗?它有用吗?任何更新? –
嗨,对不起......上床睡觉了。我尝试了你的想法,但它仍然无效...没有运气。有任何想法吗? – BostonScott