opencv - 视频编辑器控制比特率
opencv - videowriter control bitrate
我有一个可用的 python 脚本,它使用来自 opencv 的视频编写器。
来源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
由于比特率是文件大小的重要决定因素,我想知道是否
- 我可以通过视频编写器对新文件的所需比特率进行硬编码
- 是否出于某种原因需要大幅提高比特率
基本上就是这个答案
# 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()
我的 VidGear
Python Library's WriteGear API 在任何平台上自动将 OpenCV 帧流水线化到 FFmpeg 中,同时提供相同的 opencv-python 语法。这是一个基本的 python 示例:
# import libraries
from vidgear.gears import WriteGear
import cv2
output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer
stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device
writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4'
# infinite loop
while True:
(grabbed, frame) = stream.read()
# read frames
# check if frame empty
if not is grabbed:
#if True break the infinite loop
break
# {do something with frame here}
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# write a modified frame to writer
writer.write(gray)
# Show output window
cv2.imshow("Output Frame", frame)
key = cv2.waitKey(1) & 0xFF
# check for 'q' key-press
if key == ord("q"):
#if 'q' key-pressed break out
break
cv2.destroyAllWindows()
# close output window
stream.release()
# safely close video stream
writer.close()
# safely close writer
您可以查看 VidGear Docs 以获得更高级的应用程序和功能。
我有一个可用的 python 脚本,它使用来自 opencv 的视频编写器。
来源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
由于比特率是文件大小的重要决定因素,我想知道是否
- 我可以通过视频编写器对新文件的所需比特率进行硬编码
- 是否出于某种原因需要大幅提高比特率
基本上就是这个答案
# 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()
我的 VidGear
Python Library's WriteGear API 在任何平台上自动将 OpenCV 帧流水线化到 FFmpeg 中,同时提供相同的 opencv-python 语法。这是一个基本的 python 示例:
# import libraries
from vidgear.gears import WriteGear
import cv2
output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer
stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device
writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4'
# infinite loop
while True:
(grabbed, frame) = stream.read()
# read frames
# check if frame empty
if not is grabbed:
#if True break the infinite loop
break
# {do something with frame here}
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# write a modified frame to writer
writer.write(gray)
# Show output window
cv2.imshow("Output Frame", frame)
key = cv2.waitKey(1) & 0xFF
# check for 'q' key-press
if key == ord("q"):
#if 'q' key-pressed break out
break
cv2.destroyAllWindows()
# close output window
stream.release()
# safely close video stream
writer.close()
# safely close writer
您可以查看 VidGear Docs 以获得更高级的应用程序和功能。