You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本启用ffmpeg后读取文件每隔一行首字符丢失问题

问题原因及解决办法

问题出在ffmpeg会默认读取标准输入(stdin),而你的while read循环也是从stdin读取mp4.txt的内容,两者共用了同一个输入流,导致ffmpeg吃掉了部分行的内容,从而出现每隔一行首字符丢失的情况。

下面是几种可行的解决方法:

方法1:让ffmpeg读取空输入

给ffmpeg命令加上< /dev/null,强制它从空设备读取输入,不再占用循环的stdin:

ls *.mp4 > mp4.txt
while read F ; do
    echo "$F"
    echo "${F/mp4}mkv"
    ffmpeg -i "$F" -map 0 -c copy "${F/mp4}mkv" < /dev/null
done < ./mp4.txt

方法2:使用独立的文件描述符读取文件

把mp4.txt的内容重定向到独立的文件描述符(比如fd 3),让read从这个独立的描述符读取,避免和ffmpeg的stdin冲突:

ls *.mp4 > mp4.txt
while read -u 3 F ; do
    echo "$F"
    echo "${F/mp4}mkv"
    ffmpeg -i "$F" -map 0 -c copy "${F/mp4}mkv"
done 3< ./mp4.txt

方法3:去掉中间文件,直接用管道(优化版)

没必要生成mp4.txt中间文件,可以直接用管道传递ls的输出,同时处理ffmpeg的stdin问题:

ls *.mp4 | while read F ; do
    echo "$F"
    echo "${F/mp4}mkv"
    ffmpeg -i "$F" -map 0 -c copy "${F/mp4}mkv" < /dev/null
done

另外提醒下:变量引用最好加上双引号(比如echo "$F"),避免文件名包含空格、特殊字符时出现解析错误。

内容的提问来源于stack exchange,提问作者Monki Majik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:22:02