對于我的應用程式,我將 ffmpeg-python github 中的代碼改編為tensorflow streaming。
它基本上對輸入的每一幀進行解碼,讓您使用 python 處理它,然后再次對其進行編碼。
為了優化事情,我在輸入處添加了一個fps過濾器以獲得一半的 fps,因此我只能處理一半的幀,然后使用mininterpolate對編碼器中的幀進行插值以獲得原始 fps。
我的解碼器如下所示:
def decoder(in_filename):
args = (
ffmpeg
.input(in_filename)
.filter('fps', fps=30/2)
(... more filters in between ...)
.output('pipe:', format='rawvideo', pix_fmt='rgb24')
.compile()
)
return subprocess.Popen(args, stdout=subprocess.PIPE)
我的編碼器在用 python 處理幀后:
def encoder(out_filename, width, height):
args = (
ffmpeg
.input('pipe:', format='rawvideo', pix_fmt='rgb24', s='{}x{}'.format(width, height))
.filter('minterpolate', fps=30)
.filter('fps',fps=30)
.output(out_filename, pix_fmt='rgb24')
.overwrite_output()
.compile()
)
return subprocess.Popen(args, stdin=subprocess.PIPE)
之后,我將原始輸入與處理后的視頻水平堆疊
subprocess.run("ffmpeg -i {} -i {} -filter_complex hstack=inputs=2 -pix_fmt yuv420p -c:v libx264 {}".format(in_filename,out_filename,"out.mp4"))
這就是問題所在:“處理過的”視頻更快,并且在原始視頻之前結束。就像它們遵循相同的時間戳,但實際上從未插值過幀。我究竟做錯了什么?
uj5u.com熱心網友回復:
編碼器.input()必須指定其幀速率以匹配解碼器的幀速率(15 幀/秒)。rawvideo目前它使用編碼器的默認幀率。
在 FFmpeg 中,即使用-r 15 輸入選項。不確定它是什么,ffmpeg-python但可能只是r=15關鍵字引數。
PS,.filter('fps',fps=30)是多余的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/470246.html
標籤:Python ffmpeg ffmpeg-python
上一篇:jupyter和pycharm之間長整數python物件的區別?
下一篇:點擊按鈕后防止重新加載頁面
