2016-07-31 395 views
1

opencvのビデオライターを使用しているPythonスクリプトがあります。opencv - videowriterの制御ビットレート

ソースhttps://gist.github.com/stanchiang/b4e4890160a054a9c1d65f9152172600


私は、ファイルを取り込み、そして場合にかかわらず、私は単純に(効果的にファイルを複製)ライターに介してビデオフレームを渡すかどうかに私はフレームを編集しようとした場合、ファイルは常に大きくなります。私はそれがオリジナルよりも大きくないことを望んでいます(私のスクリプトを読んでいれば、たくさんのものをぼかすので)。

ffprobe -v quiet -print_format json -show_format -show_streams inputFile.mp4を使用してメタデータを確認したところ、新しいファイルのビットレートは以前のバージョンよりも5.5倍以上高くなっています。 https://www.diffchecker.com/8r2syeln


ビットレートはファイルサイズの大きな決定要因であるため

  1. iは、映像作家による新しいファイルの所望のビットレートをハードコーディングすることができた場合

    ソース、私は思ったんだけど

  2. 何らかの理由で大幅に増加したビットレートが必要かどうか
+0

が優れており、私の経験から、出力のビットレートは入力から変更されません。 – boardrider

+0

すべての方法を右に切り替えることはできませんか?スクリプトは、opencvアルゴリズムを使用してビデオフレームをフレームごとに編集します。フレームごとに新しいビデオフレームに書き込むためにffmpegを使用する方法はありますか? – stanley

+0

@stanleyいいえあなたの方法の唯一の方法は、すべてのフレームを生成してOpenCVを使ってビデオを完全に書き込むことです。その後、FFMPEGを使用してビットレートを変更してビデオを圧縮します。しかし、RGBデータをパイプを使って直接FFMPEGに送ることは可能ですが、OpenCVは使用しません。 – rayryeng

答えて

2

基本的にこの答えあなたはFFmpegは、すべてのビデオパラメータの制御として に切り替えたいことがあり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() 
関連する問題