2016-07-31 1718 views
1

我有一個使用opencv視頻編寫器的工作python腳本。opencv - videowriter控制比特率

https://gist.github.com/stanchiang/b4e4890160a054a9c1d65f9152172600


如果我把一個文件中,也不管我是否只是通過傳視頻幀的作家(有效複製文件),或者如果我嘗試編輯框時,文件總是較大。我希望它不會比原來的大(因爲如果你閱讀我的腳本,我正在模糊很多東西)。

檢查它們的元數據後,我注意到新文件的比特率比以前高了5.5倍。

https://www.diffchecker.com/8r2syeln


因爲碼率是文件大小的一個大的決定,我想知道如果

  1. 我可以通過視頻作家硬編碼的新文件的比特率所需
  2. 是否由於某種原因需要大量增加比特率
+0

你可能想切換到FFmpeg的, 所有視頻參數的控制非常出色那裏,從我的經驗,輸出的比特率將不會從輸入改變。 – boardrider

+0

無法完全切換到正確的位置?該腳本使用opencv算法逐幀編輯視頻。有沒有一種方法可以使用ffmpeg逐幀寫入新視頻? – stanley

+0

@stanley編號您的方法唯一的方法是使用OpenCV完全編寫視頻並生成所有幀,然後在完成後使用FFMPEG通過改變比特率來壓縮視頻。但是,可以使用管道將RGB數據直接發送到FFMPEG,但不使用OpenCV。 – rayryeng

回答

2

基本上這個答案https://stackoverflow.com/a/13298538/1079379

# import packages 
from PIL import Image 
from subprocess import Popen, PIPE 
from imutils.video import VideoStream 
from imutils.object_detection import non_max_suppression 
from imutils import paths 
import cv2 
import numpy as np 
import imutils 

# ffmpeg setup 
p = Popen(['ffmpeg', '-y', '-f', 'image2pipe', '-vcodec', 'mjpeg', '-r', '24', '-i', '-', '-vcodec', 'h264', '-qscale', '5', '-r', '24', 'video.mp4'], stdin=PIPE) 

video = cv2.VideoCapture('videos.mp4') 

while True: 
    ret, frame = video.read() 
    if ret: 
     frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
     im = Image.fromarray(frame) 
     im.save(p.stdin, 'JPEG') 
    else: 
     break 

p.stdin.close() 
p.wait() 
video.release() 
cv2.destroyAllWindows()