Akagi201
10/23/2015 - 2:42 AM

Comparing speed of reading video frames via a subprocess, or via PyAV

Comparing speed of reading video frames via a subprocess, or via PyAV

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)
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))
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