opencamera on a Raspberry Pi
Opened this issue · 5 comments
I'm trying to fetch frames from a Raspberry Pi camera (headless Raspbian on 32-bit ARMv7).
I also tired @hhaensel's solution mentioned here: #341 (comment)
(tmp) pkg> st
Status `~/tmp/Project.toml`
[d6d074c3] VideoIO v0.9.6
julia> using VideoIO
julia> cam = VideoIO.opencamera()
ERROR: MethodError: no method matching unsafe_convert(::Type{Ptr{Ptr{VideoIO.libffmpeg.AVDictionary}}}, ::VideoIO.AVDict)
Closest candidates are:
unsafe_convert(::Type{Ptr{T}}, ::Base.Threads.Atomic{T}) where T at ~/julia-1.7.2/share/julia/base/atomics.jl:328
unsafe_convert(::Type{Ptr{T}}, ::SubArray{T, N, P, <:Tuple{Vararg{Union{Int32, AbstractRange{Int32}}}}}) where {T, N, P} at ~/julia-1.7.2/share/julia/base/subarray.jl:426
unsafe_convert(::Type{Ptr{T}}, ::SubArray{T, N, P, <:Tuple{Vararg{Union{Int32, AbstractRange{Int32}, Base.ReshapedArray{T, N, A, Tuple{}} where {T, N, A<:AbstractUnitRange}}}}}) where {T, N, P} at ~/julia-1.7.2/share/julia/base/reshapedarray.jl:292
...
Stacktrace:
[1] avformat_open_input(ps::VideoIO.NestedCStruct{VideoIO.libffmpeg.AVFormatContext}, url::String, fmt::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict)
@ VideoIO.libffmpeg ~/.julia/packages/VideoIO/EsW3Z/lib/libffmpeg.jl:8571
[2] open_avinput(avin::VideoIO.AVInput{String}, source::String, input_format::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:195
[3] VideoIO.AVInput(source::String, input_format::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict; avio_ctx_buffer_size::Int32)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:218
[4] VideoIO.AVInput(source::String, input_format::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:207
[5] opencamera(::String, ::Ptr{VideoIO.libffmpeg.AVInputFormat}, ::VideoIO.AVDict; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:1016
[6] opencamera(::String, ::Ptr{VideoIO.libffmpeg.AVInputFormat}, ::VideoIO.AVDict) (repeats 2 times)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:1016
[7] top-level scope
@ REPL[6]:1
julia> import Base.cconvert
julia> Base.cconvert(::Type{Ptr{Ptr{VideoIO.AVDictionary}}}, d::VideoIO.AVDict) = d.ref_ptr_dict
julia> cam = VideoIO.opencamera()
ERROR: Could not open /dev/video0. avformat_open_input error code -13
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:33
[2] open_avinput
@ ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:196 [inlined]
[3] VideoIO.AVInput(source::String, input_format::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict; avio_ctx_buffer_size::Int32)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:218
[4] AVInput
@ ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:207 [inlined]
[5] #opencamera#26
@ ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:1016 [inlined]
[6] opencamera(::String, ::Ptr{VideoIO.libffmpeg.AVInputFormat}, ::VideoIO.AVDict) (repeats 2 times)
@ VideoIO ~/.julia/packages/VideoIO/EsW3Z/src/avio.jl:1016
[7] top-level scope
@ REPL[9]:1
julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
Platform Info:
OS: Linux (arm-linux-gnueabihf)
CPU: ARMv7 Processor rev 3 (v7l)
WORD_SIZE: 32
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, cortex-a72)
I should mention that both raspistill
and raspivid
work as expected, and:
$ v4l2-ctl -d /dev/video0 --all
Driver Info:
Driver name : bm2835 mmal
Card type : mmal service 16.1
Bus info : platform:bcm2835-v4l2-0
Driver version : 5.10.63
Capabilities : 0x85200005
Video Capture
Video Overlay
Read/Write
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x05200005
Video Capture
Video Overlay
Read/Write
Streaming
Extended Pix Format
Priority: 2
Video input : 0 (Camera 0: ok)
Format Video Capture:
Width/Height : 1024/768
Pixel Format : 'YU12' (Planar YUV 4:2:0)
Field : None
Bytes per Line : 1024
Size Image : 1179648
Colorspace : SMPTE 170M
Transfer Function : Default (maps to Rec. 709)
YCbCr/HSV Encoding: Default (maps to ITU-R 601)
Quantization : Default (maps to Limited Range)
Flags :
Format Video Overlay:
Left/Top : 150/50
Width/Height: 1024/768
Field : None
Chroma Key : 0x00000000
Global Alpha: 0xff
Clip Count : 0
Clip Bitmap : No
Framebuffer Format:
Capability : Extern Overlay
Global Alpha
Flags : Overlay Matches Capture/Output Size
Width : 1024
Height : 768
Pixel Format : 'YU12'
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 1
User Controls
brightness 0x00980900 (int) : min=0 max=100 step=1 default=50 value=50 flags=slider
contrast 0x00980901 (int) : min=-100 max=100 step=1 default=0 value=0 flags=slider
saturation 0x00980902 (int) : min=-100 max=100 step=1 default=0 value=0 flags=slider
red_balance 0x0098090e (int) : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
blue_balance 0x0098090f (int) : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
horizontal_flip 0x00980914 (bool) : default=0 value=0
vertical_flip 0x00980915 (bool) : default=0 value=0
power_line_frequency 0x00980918 (menu) : min=0 max=3 default=1 value=1
sharpness 0x0098091b (int) : min=-100 max=100 step=1 default=0 value=0 flags=slider
color_effects 0x0098091f (menu) : min=0 max=15 default=0 value=0
rotate 0x00980922 (int) : min=0 max=360 step=90 default=0 value=0 flags=modify-layout
color_effects_cbcr 0x0098092a (int) : min=0 max=65535 step=1 default=32896 value=32896
Codec Controls
video_bitrate_mode 0x009909ce (menu) : min=0 max=1 default=0 value=0 flags=update
video_bitrate 0x009909cf (int) : min=25000 max=25000000 step=25000 default=10000000 value=10000000
repeat_sequence_header 0x009909e2 (bool) : default=0 value=0
h264_i_frame_period 0x00990a66 (int) : min=0 max=2147483647 step=1 default=60 value=60
h264_level 0x00990a67 (menu) : min=0 max=13 default=11 value=11
h264_profile 0x00990a6b (menu) : min=0 max=4 default=4 value=4
Camera Controls
auto_exposure 0x009a0901 (menu) : min=0 max=3 default=0 value=0
exposure_time_absolute 0x009a0902 (int) : min=1 max=10000 step=1 default=1000 value=1000
exposure_dynamic_framerate 0x009a0903 (bool) : default=0 value=0
auto_exposure_bias 0x009a0913 (intmenu): min=0 max=24 default=12 value=12
white_balance_auto_preset 0x009a0914 (menu) : min=0 max=10 default=1 value=1
image_stabilization 0x009a0916 (bool) : default=0 value=0
iso_sensitivity 0x009a0917 (intmenu): min=0 max=4 default=0 value=0
iso_sensitivity_auto 0x009a0918 (menu) : min=0 max=1 default=1 value=1
exposure_metering_mode 0x009a0919 (menu) : min=0 max=3 default=0 value=0
scene_mode 0x009a091a (menu) : min=0 max=13 default=0 value=0
JPEG Compression Controls
compression_quality 0x009d0903 (int) : min=1 max=100 step=1 default=30 value=30
Fixed by #345
I just tested it on a Raspberry Pi and:
julia> cam = VideoIO.opencamera()
ERROR: Could not open /dev/video0. avformat_open_input error code -22
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:33
[2] open_avinput
@ ~/.julia/packages/VideoIO/3LUls/src/avio.jl:196 [inlined]
[3] VideoIO.AVInput(source::String, input_format::Ptr{VideoIO.libffmpeg.AVInputFormat}, options::VideoIO.AVDict; avio_ctx_buffer_size::Int32)
@ VideoIO ~/.julia/packages/VideoIO/3LUls/src/avio.jl:218
[4] AVInput
@ ~/.julia/packages/VideoIO/3LUls/src/avio.jl:207 [inlined]
[5] #opencamera#26
@ ~/.julia/packages/VideoIO/3LUls/src/avio.jl:1024 [inlined]
[6] opencamera(::String, ::Ptr{VideoIO.libffmpeg.AVInputFormat}, ::VideoIO.AVDict) (repeats 2 times)
@ VideoIO ~/.julia/packages/VideoIO/3LUls/src/avio.jl:1024
[7] top-level scope
@ REPL[4]:1
(jl_1G6zU9) pkg> st
Status `/tmp/jl_1G6zU9/Project.toml`
[d6d074c3] VideoIO v1.0.0
julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
Platform Info:
OS: Linux (arm-linux-gnueabihf)
CPU: ARMv7 Processor rev 3 (v7l)
WORD_SIZE: 32
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, cortex-a72)
Let me know if there is anything I can test or should do.
I'm getting the same "error code -22", in Raspberry Pi OS Lite Bullseye (with latest updates), on a Raspberry Pi Zero 2 W.
ERROR: LoadError: Could not open /dev/video0. avformat_open_input error code -22
Julia 1.8.5.
Program works fine on my Mac laptop.
I'm desperate to replace Python / OpenCV in my application.
For what is worth, 22 is EINVAL
: https://ffmpeg.org/doxygen/2.8/libavformat_2utils_8c_source.html#l00405
Thanks! I'll poke around a bit with opencamera
. Maybe it's obvious....