I have a working python script that uses the video writer from opencv.
source https://gist.github.com/stanchiang/b4e4890160a054a9c1d65f9152172600
If i take in a file, and regardless of whether I simply pass the video frame through to the writer (effectively duplicating the file) or if i try to edit the frame, the file is always larger. I would like for it to be no larger than the original (since if you read my script i’m blurring a lot of stuff).
After checking their metadata, with ffprobe -v quiet -print_format json -show_format -show_streams inputFile.mp4
I notice that the bitrate of the new file is over 5.5x higher than before.
source https://www.diffchecker.com/8r2syeln
since bitrate is a big determinant of file size, I’m wondering if
- i can hardcode the desired bitrate of the new file through the video writer
- whether for some reason the heavily increased bit rate is needed
Advertisement
Answer
basically this answer 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()