Mac下FFmpeg批量处理含空格文件名文件时首文件失败求助
问题场景
在Mac系统下使用Bash脚本批量处理目录内带空格的视频文件,通过ffmpeg -c copy转换封装格式时,发现首个文件总是处理失败,后续文件可正常完成;单独处理单个文件时也能成功执行。
原脚本代码:
echo my converter read -p "Enter give folder: " folder echo '//////////////////////START CONVERTING FROM FOLDER///////////////////////' find $folder -type f -name "*[[:space:]]*" | while read file; do release="${file%%.*}"'_t.mp4'; echo "$file"; ffmpeg -i "$file" -c copy "$release" -loglevel error -stats echo $release; done
报错信息
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 17 expected 2 got 3
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 0 expected 0 got 2
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 4096 expected 0 got 2
[mpegts @ 0x7fb8e9904a40] Continuity check failed for pid 256 expected 2 got 7
[mpegts @ 0x7fb8e9904a40] Packet corrupt (stream = 0, dts = 203523000).
/Users/xy/Downloads/aaa/aa vv.ts: corrupt input packet in stream 0
[NULL @ 0x7fb8e9905a40] Decoding VUI
异常现象
- 目录存在多个文件时,首个文件处理失败,后续文件正常完成
- 目录仅包含单个文件时,处理可正常完成
- 注释
ffmpeg命令后,脚本的文件遍历与输出均符合预期
解决建议
1. 阻止FFmpeg占用标准输入
FFmpeg默认会读取标准输入,而while read file同样从标准输入获取文件路径,两者冲突导致首个文件路径被FFmpeg误读,引发处理异常。在ffmpeg命令中添加-nostdin参数,禁止其读取标准输入:
ffmpeg -i "$file" -c copy "$release" -loglevel error -stats -nostdin
2. 优化文件名读取逻辑(可选)
使用find的-print0结合while read -d $'\0',更安全地处理带空格、特殊字符的文件名,避免路径被错误分割:
echo my converter read -p "Enter give folder: " folder echo '//////////////////////START CONVERTING FROM FOLDER///////////////////////' find "$folder" -type f -name "*[[:space:]]*" -print0 | while read -d $'\0' file; do release="${file%%.*}"'_t.mp4'; echo "$file"; ffmpeg -i "$file" -c copy "$release" -loglevel error -stats -nostdin echo "$release"; done
同时注意将find $folder改为find "$folder",防止目录名带空格时出现遍历错误。
3. 修复视频时间戳问题(补充)
如果添加-nostdin后仍有报错,可以尝试用-fflags +genpts参数修复可能的时间戳异常:
ffmpeg -i "$file" -c copy "$release" -loglevel error -stats -nostdin -fflags +genpts
内容的提问来源于stack exchange,提问作者e e

