Last active
January 1, 2024 11:44
-
-
Save mikeboers/6843684 to your computer and use it in GitHub Desktop.
Comparing speed of reading video frames via a subprocess, or via PyAV
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2013-10-05 10:19:59 mikeboers@maxwell: ~/Documents/Python/PyAV | |
$ time python video_frames_via_pipe.py | |
real 0m0.564s | |
user 0m0.729s | |
sys 0m0.241s | |
2013-10-05 10:20:01 mikeboers@maxwell: ~/Documents/Python/PyAV | |
$ time python video_frames_via_pyav.py | |
real 0m0.220s | |
user 0m0.457s | |
sys 0m0.059s |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import subprocess | |
import numpy | |
proc = subprocess.Popen(['ffmpeg', | |
"-i", "sandbox/640x360.mp4", | |
"-f", "image2pipe", | |
"-pix_fmt", "rgb24", | |
"-vcodec", "rawvideo", | |
"-"], | |
stdout=subprocess.PIPE, | |
) | |
while True: | |
raw_image = proc.stdout.read(640 * 360 * 3) | |
if not raw_image: | |
break | |
image = numpy.fromstring(raw_image, dtype='uint8').reshape((640, 360, 3)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Image | |
import av | |
def frame_iter(video): | |
streams = [s for s in video.streams if s.type == b'video'] | |
streams = [streams[0]] | |
for packet in video.demux(streams): | |
for frame in packet.decode(): | |
yield frame | |
video = av.open('sandbox/640x360.mp4') | |
frames = frame_iter(video) | |
for frame in frames: | |
img = Image.frombuffer("RGBA", (frame.width, frame.height), frame.to_rgba(), "raw", "RGBA", 0, 1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Is this comparison fair enough? In video_frames_via_pipe.py, line 18:
image = numpy.fromstring(raw_image, dtype='uint8').reshape((640, 360, 3))
it will make a copy of the data. Instead, frombuffer will not make a copy(similar to what you did in video_frames_via_pyav.py, line 16):
image = numpy.frombuffer(raw_image, dtype='uint8').reshape((640, 360, 3))