之前用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 。