JuliaIO / VideoIO.jl

Reading and writing of video files in Julia via ffmpeg
https://juliaio.github.io/VideoIO.jl/stable
Other
126 stars 53 forks source link

Add code for non-transcoded video streams #277

Closed dawbarton closed 3 years ago

dawbarton commented 3 years ago

Fixes #111 and enables frames to be grabbed from a webcam without transcoding. This is particularly useful when only luminance values are required and the transcoding to RGB is actually unhelpful.

I use this within a Raspberry Pi computer vision system for control. As such, speed is important - without transcoding I can grab a frame in 1.5ms whereas with transcoding it takes 63.5ms.

The data is returned in a UInt8 array rather than a more specifically typed array but this seems to be in line with the original (unimplemented) intent. To interpret this data, the specific webcam pixel format needs to be known but that is relatively trivial (see cam = VideoIO.opencamera(;transcode=false); cam.format and compare against the AVPixelFormat values in libavutil_h.jl.

codecov[bot] commented 3 years ago

Codecov Report

Merging #277 (079df0c) into master (7e05dc3) will decrease coverage by 0.38%. The diff coverage is 0.00%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #277      +/-   ##
==========================================
- Coverage   76.48%   76.09%   -0.39%     
==========================================
  Files          14       14              
  Lines         591      594       +3     
==========================================
  Hits          452      452              
- Misses        139      142       +3     
Impacted Files Coverage Δ
src/avio.jl 73.59% <0.00%> (-0.74%) :arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update 7e05dc3...079df0c. Read the comment docs.

yakir12 commented 3 years ago

on my RPI this:

using VideoIO, BenchmarkTools
cam = VideoIO.opencamera()
img = read(cam)
@btime read!($cam, $img)

results in 11.039 ms. Using this PR, and transcode=false results in 845.115 μs! A ~13 times speedup!

IanButterworth commented 3 years ago

For anyone doing a test like this ^ in the future, you may want to

@btime read!($cam, $img) setup=(sleep(0.1))

to give the camera time to make a new frame available, if the camera buffer waits for new, otherwise the timing may depend on framerate

IanButterworth commented 3 years ago

Thanks @dawbarton and thanks for testing @yakir12