之前用ffmpeg拼接视频文件时,遇到一个问题,被师傅解决了,这是师傅写的文章:
https://juejin.im/post/5e9328ea6fb9a03c917fd8af
师傅用的MAC OS,而我用的windows 8
因此我按师傅的方法尝试了一下,同时也学到了不少
出错情况
使用ffmpeg将许多mp4文件合成一个mp4文件
错误提示:Non-monotonous DTS in output stream 0:0; previous: 21587350, current: 12740928; changing to 21587351. This may result in incorrect timestamps in the output file.
在播放生成的文件时发现,从某个时间点开始的十分钟,其画面都被前面的画面覆盖掉,只剩下声音是对的。
刚才查到一篇文章,讲的貌似就是这个问题的原理及解决方法,详细看:
https://iyn.me/i/post-32.html
解决过程
- 在待处理片段的目录下,打开git bash
$ for f in ./*.mp4; do ffmpeg -i $f -q 0 "${f%.*}.mts"; done
- 后台打开记事本
$ notepad create_list.py &
编写如下脚本并执行:
f = open("list.txt",'w')
for i in range(2,33):
f.write("file crypto1-1-" + str(i) + ".mts" +'\n')
$ python create_list.py
$ cat list.txt
- 执行合并操作
$ ffmpeg -f concat -i list.txt -c copy output.mp4
总结
这次提醒了我,以后要多用stackoverflow。师傅说他就是在stackoverflow查到的。
- ffmpeg
mp4转mts
ffmpeg -i xxx.mp4 -q 0 xxx.mts
这里 -q 0 好像是说 让输出的mts与之前的mp4保持VBR一致,总之填上就对了。
视频合并操作
ffmpeg -f concat -i list.txt -c copy output.mp4
list.txt中的内容形如:
file *.mp4/mts/…
- 文件名操作
"${f%.*}.mts"
这里$f{%.*} 是去掉文件名中 最后一个点及右边内容
更多文件名操作可以看:https://blog.csdn.net/jiezi2016/article/details/79649382
- bash后台方式跑命令
$ notepad create_list.py &
& 让notepad后台运行,让bash能够继续输入和执行命令,方便操作。原理好像是fork一个新进程去执行 notepad 。