我正在從一系列影像制作 mp4 檔案。影像應該運行大約 1 小時,但我無法獲得完整的視頻,因為 FFMPEG 尋找它不應該有的檔案。
[image2 @ 0x55fe14bef700] Could not open file : /mnt/run/image-005437.jpeg
令人困惑的是,我傳遞給 ffmpeg 的串列不應該包含該檔案。如果我的腳本不喜歡結果,它會將檔案發送到名為 failed 的目標檔案夾中的子目錄
具有該編號的檔案的位置
$ pwd
run/failed
]$ ls
failed-005437.jpeg
我用來啟動 ffmpeg 的命令如下
image_folder=$1
singularity exec --bind $work_dir:/mnt $work_dir/longleaf2.sif ffmpeg -f concat -safe 0 -y -i <(for f in /mnt/processed_images/$image_folder/image-d.jpeg; do echo "file '$f'";done) -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2" -movflags faststart /mnt/run/summary_files/${image_folder}.mp4
我已經檢查過處理過的影像,但它不在那里,那么 ffmpeg 為什么要尋找它呢?
失敗運行的 pastebin
https://pastebin.com/pF5ZefLf
我檢查檔案不在 for 回圈參考的檔案夾中,因此它永遠不會導致錯誤
$ ls image-005437.*
ls: cannot access image-005437.*: No such file or directory
uj5u.com熱心網友回復:
問題
當你運行時:
for f in /mnt/processed_images/$image_folder/image-d.jpeg; do echo "file '$f'";done
它會輸出:
file '/mnt/processed_images/foo/image-d.jpeg'
那么 ffmpeg 將使用序列模式型別作為影像 demuxer。這需要一個連續的序列。
解決方案 1:全域
使用全域:
for f in /mnt/processed_images/$image_folder/*.jpeg; do echo "file '$f'";done
現在它將輸出每個檔案。在這個例子image-000003.jpeg中不存在所以它不會被列出:
file '/mnt/processed_images/foo/image-000001.jpeg'
file '/mnt/processed_images/foo/image-000002.jpeg'
file '/mnt/processed_images/foo/image-000004.jpeg'
解決方案 2:簡化并跳過 concat
更好的是通過在 ffmpeg 本身中使用影像解復用器的 glob 模式型別來簡化您的命令,然后您可以避免使用 concat 解復用器:
image_folder=$1
singularity exec --bind "$work_dir":/mnt "$work_dir"/longleaf2.sif ffmpeg -pattern_type glob -framerate 25 -i "/mnt/processed_images/$image_folder/*.jpeg" -vf "crop=trunc(iw/3)*2:trunc(ih/2)*2,format=yuv420p" -movflags faststart /mnt/run/summary_files/${image_folder}.mp4
- 影像解復用器 glob 模式不適用于 Windows 用戶。
- 添加了影像解復用器的
-framerate輸入選項。 - 添加了格式過濾器以進行 YUV 4:2:0 色度子采樣以實作兼容性。
- 變數已被參考。請參閱shellcheck.net。
- FFmpeg 4.1 發布分支很舊。在做任何其他事情之前下載或編譯一個現代版本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333645.html
