我有一個程序可以生成圖像并從中創(chuàng)建視頻。目前可行的是一次創(chuàng)建所有圖像,然后在子進(jìn)程中運行 FFmpeg 并通過標(biāo)準(zhǔn)輸入管道圖像以創(chuàng)建視頻:cmd = ['ffmpeg', '-y', '-s', '{}x{}'.format(OUTPUT_WIDTH, OUTPUT_HEIGHT), '-r', str(OUTPUT_VIDEO_FPS), '-an', '-pix_fmt', colour, '-c:v', 'rawvideo', '-f', 'rawvideo', '-i', '-', '-vcodec', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'medium', OUTPUT_VIDEO_PATH]out_frames = []for i in range(num_frames): out_frame = render_frame(...) out_frames.append(out_frame)with _call_subprocess(sp.Popen(cmd, stdin=sp.PIPE, stderr=sp.PIPE, stdout=DEVNULL)) as pipe: for frame_no, frame in enumerate(out_frames): pipe.stdin.write(frame)但是,當(dāng)我有數(shù)千張無法全部放入內(nèi)存的圖像時,這變得不可行,因為子進(jìn)程 fork 調(diào)用請求了太多內(nèi)存并且失敗了。我的解決方案是在程序開始時分叉(避免內(nèi)存錯誤),然后在創(chuàng)建幀時將幀通過管道傳輸?shù)綐?biāo)準(zhǔn)輸入:cmd = ['ffmpeg', '-y', '-s', '{}x{}'.format(OUTPUT_WIDTH, OUTPUT_HEIGHT), '-r', str(OUTPUT_VIDEO_FPS), '-an', '-pix_fmt', colour, '-c:v', 'rawvideo', '-f', 'rawvideo', '-i', '-', '-vcodec', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'medium', OUTPUT_VIDEO_PATH]with _call_subprocess(sp.Popen(cmd, stdin=sp.PIPE, stderr=sp.PIPE, stdout=DEVNULL)) as pipe: for i in range(num_frames): out_frame = render_frame(...) pipe.stdin.write(out_frame)但是,ffmpeg 的輸出現(xiàn)在已損壞。我很確定這與以下事實有關(guān)到標(biāo)準(zhǔn)輸入,輸出也損壞了!cmd = ['ffmpeg', '-y', '-s', '{}x{}'.format(OUTPUT_WIDTH, OUTPUT_HEIGHT), '-r', str(OUTPUT_VIDEO_FPS), '-an', '-pix_fmt', colour, '-c:v', 'rawvideo', '-f', 'rawvideo', '-i', '-', '-vcodec', 'libx264', '-pix_fmt', 'yuv420p', '-preset', 'medium', OUTPUT_VIDEO_PATH]out_frames = []for i in range(num_frames): out_frame = render_frame(...) out_frames.append(out_frame)但是我不確定是什么導(dǎo)致了這個或如何修復(fù)它(FFmpeg 是否以某種方式輪詢一個空管道然后被損壞?我不明白子進(jìn)程通信是如何工作的......)。任何幫助,將不勝感激。
1 回答

桃花長相依
TA貢獻(xiàn)1860條經(jīng)驗 獲得超8個贊
不知道為什么會這樣,但是將sp.Popen
運行 FFmpeg 的調(diào)用從工作更改sp.Popen(cmd, stdin=sp.PIPE, stderr=sp.PIPE, stdout=DEVNULL)
為sp.Popen(cmd, stdin=sp.PIPE, stderr=DEVNULL, stdout=DEVNULL)
工作。我猜這與這個關(guān)于 stderr 管道問題的問題有關(guān)。
添加回答
舉報
0/150
提交
取消