【问题标题】:Raspberry Pi : use VLC to stream webcam : Logitech C920 [H264 Video without transcoding + Audio + LED control] - SpyCam / BabyCam树莓派:使用 VLC 流式传输网络摄像头:罗技 C920 [H264 视频无转码 + 音频 + LED 控制] - SpyCam / BabyCam
【发布时间】:2018-09-25 13:10:48
【问题描述】:

我有一个 RaspberryPi 和一个罗技 C920 网络摄像头。 我想将这些设备用作监控/婴儿摄像机,即:通过 HTTP(或任何其他协议)流式传输音频 + 视频,无需 CPU 密集型视频 转码

C920 网络摄像头可以原生流 H264,所以理论上我不需要让 RaspberyPi+VLC 转码视频流。

内置 C920 麦克风流似乎未包含在网络摄像头流中。 摄像头和麦克风是 2 个独立的设备。

C920 还具有内置 LED 指示灯。我想控制它以避免 LED 在录制时亮起。

我怎样才能做到这一点?

【问题讨论】:

    标签: http raspberry-pi3 webcam raspbian vlc


    【解决方案1】:

    此解决方案已经过测试,可使用以下版本。 使用这种方法,RaspberryPi3 的 CPU 始终在 5% 左右。

    编辑 2018-11-18: 您还可以在RaspiVWS project homepage 上查看一体化解决方案原型(对于好奇的人,请参阅GitHub project

    0。初步检查

    1.网络摄像头视频配置

    2。麦克风识别

    3.使用 VLC 流式传输

    4.让 RaspberryPi3+ 成为 Wifi 接入点 (如果你没有现有的网络可以连接你的 Pi)

    5.在启动时编写脚本或作为服务编写

    6. [编辑] 附加命令:无限循环录制和分割视频

    7. [编辑] 给定时刻的程序执行

    8. [编辑] 疑难解答


    0。初步检查

    答案是使用 Raspbian 9.4 Stretch。 使用以下命令检查您的版本:

    lsb_release -a
    

    你应该看到:

    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 9.4 (stretch)
    Release:        9.4
    Codename:       stretch
    

    我们可以依靠以下工具:

    • v4l 允许控制网络摄像头。它提供了命令v4l2-ctl,这将允许我们控制和配置网络摄像头。
    • VLC 不仅是视频播放器,还具有强大的流媒体功能

    您可以使用以下命令安装它们:

    sudo apt-get install vlc
    sudo apt-get install v4l-utils
    

    安装完所有内容后,您就可以配置 C920 网络摄像头了。


    1。网络摄像头视频配置

    v4l2-ctl --all 列出所有可用设备及其配置

    pi@raspberrypi:~ $ v4l2-ctl --all
    Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : HD Pro Webcam C920
        Bus info      : usb-3f980000.usb-1.5
        Driver version: 4.14.30
        Capabilities  : 0x84200001
            Video Capture
            Streaming
            Extended Pix Format
            Device Capabilities
        Device Caps   : 0x04200001
            Video Capture
            Streaming
            Extended Pix Format
    Priority: 2
    Video input : 0 (Camera 1: ok)
    Format Video Capture:
        Width/Height      : 1920/1080
        Pixel Format      : 'H264'
        Field             : None
        Bytes per Line    : 3840
        Size Image        : 4147200
        Colorspace        : sRGB
        Transfer Function : Default
        YCbCr/HSV Encoding: Default
        Quantization      : Default
        Flags             : 
    Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 1920, Height 1080
        Default     : Left 0, Top 0, Width 1920, Height 1080
        Pixel Aspect: 1/1
    Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
    Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
    Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 30.000 (30/1)
        Read buffers     : 0
                         brightness (int)    : min=0 max=255 step=1 default=-8193 value=128
                           contrast (int)    : min=0 max=255 step=1 default=57343 value=128
                         saturation (int)    : min=0 max=255 step=1 default=57343 value=128
     white_balance_temperature_auto (bool)   : default=1 value=1
                               gain (int)    : min=0 max=255 step=1 default=57343 value=255
               power_line_frequency (menu)   : min=0 max=2 default=2 value=2
          white_balance_temperature (int)    : min=2000 max=6500 step=1 default=57343 value=4822 flags=inactive
                          sharpness (int)    : min=0 max=255 step=1 default=57343 value=128
             backlight_compensation (int)    : min=0 max=1 step=1 default=57343 value=0
                      exposure_auto (menu)   : min=0 max=3 default=0 value=3
                  exposure_absolute (int)    : min=3 max=2047 step=1 default=250 value=333 flags=inactive
             exposure_auto_priority (bool)   : default=0 value=1
                       pan_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                      tilt_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                     focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                         focus_auto (bool)   : default=1 value=1
                      zoom_absolute (int)    : min=100 max=500 step=1 default=57343 value=100
                          led1_mode (menu)   : min=0 max=3 default=3 value=3
                     led1_frequency (int)    : min=0 max=255 step=1 default=0 value=0
    

    最后 2 行为我们提供了控制内置 LED 指示灯的线​​索,例如,停用 LED 指示灯。 -d0 参数指示应在哪个设备上应用修改(如果您有多个凸轮或其设备名称已更改)

    v4l2-ctl -d0 --set-ctrl=led1_mode=0
    v4l2-ctl -d0 --set-ctrl=led1_frequency=30
    

    2。麦克风识别

    命令arecord -l 将为我们提供 ALSA 设备列表。 (ALSA 是 RaspberryPi 中的音频管理器)

    pi@raspberrypi:~ $ arecord -l
    **** Liste des Périphériques Matériels CAPTURE ****
    carte 1: C920 [HD Pro Webcam C920], périphérique 0: USB Audio [USB Audio]
      Sous-périphériques: 1/1
      Sous-périphérique #0: subdevice #0
    

    这意味着内置麦克风位于hardware 1, periph 0。您可以在命令行中使用alsamixer -c 1 -V capture 进行检查

    3。使用 VLC 流式传输

    VLC 可以使用命令行启动。 由于我们没有在单个流访问中将视频和音频混合在一起,因此我们需要让 VLC 来执行此操作。 这是VLC的transcoding功能的作用。

    1. 通过 HTTP 流式传输

    我们还想通过 HTTP 进行流式传输,VLC 也可以实现。

    cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
    

    解释

    • v4l2:///dev/video0:chroma=h264 提供 VLC 输入数据:它从 /dev/video0 获取视频流,并且它是 h264 编码(如果您的网络摄像头是第 0 个视频设备,它也可能是另一个数字,请参阅 v4l2-ctl --all 命令)
    • :input-slave=alsa://hw:1,0 告诉 VLC 使用另一个视频输入流。就是上面arecord标识的音频流
    • --sout 告诉 VLC 如何处理输出流
    • #transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1} 告诉 VLC 将音频转换为 mpga 编解码器,128 kbits/s,2 通道,44100 Hz 采样,使用所有 4 个 RaspberryPi3+ 内核。音频同步是可选的。我花了一些时间才意识到这一点:网络摄像头 h264 视频流保持原样(无视频转码)。
    • :standard{access=http,mux=ts,mime=video/ts,dst=:8099} 告诉 VLC 在端口 8099 上以 TS muxing 格式通过 HTTP 提供流。

    在任何其他设备上,您可以使用 VLC 访问您的 RaspberryPi3+ VLC 流: vlc http://<raspberrypi-ip>:8099

    它适用于任何 VLC 客户端:

    • 窗户
    • unix
    • mac
    • 已在带有 VLC 应用 (3.0.3 (305)) 的 iPhone 7 (v11.2.1 (15C153)) 上确认

    注意:在网络摄像头的输出中使用 H264 1920x1080 30fps 的视频可以节省大量 RaspberryPi3+ CPU。

    1. 不同的容器

    你还可以录制到各种容器,甚至容器+流,这里有一些例子:

    • 录制到 MKV cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mkv,dst='/home/pi/Webcam_Record/MyVid.mkv'}'

    • 录制到 MP4 cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'}'

    • 记录 + 流 cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'},dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}}'

      1. 格式化文件名、时间戳

    您也可以使用格式化字符串作为文件名。前缀命令如下:

    cvlc --sout-file-format v4l2:///dev/video0:<...> dst='/home/pi/Webcam_Record/%F_%T_MyVid.mp4'}
    

    它将生成一个名为YYYY-MM-DD_HH:MM:SS_MyVid.mp4 的文件(: 在 unix 文件名中被授权,但在 windows 文件名中不被授权)

    4。让 RaspberryPi3+ 成为 Wifi 接入点

    如果您没有现有网络可将您的 Pi 连接到: 您可以按照 RaspberryPi3+ 官方网站的说明进行操作:https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

    否则,如果您已经有网络,则可以使用其 IP 连接到您的 pi。 见第三部分

    在任何其他设备上,您可以使用 VLC 访问您的 RaspberryPi3+ VLC 流:vlc http://&lt;raspberrypi-ip&gt;:8099

    5。启动脚本

    您可以将许多命令放入 bash 文件 my_bash_file.sh。 例如:

    #!/bin/bash
    # auto stream launch + led off
    #cvlc -vvv for verbose debug
    
    # change this value to adapt to your webcam device number
    deviceNb=0
    
    # force video format + led off
    v4l2-ctl -d${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0
    
    # if delay needed 
    # cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0  :live-caching=2500  --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
    
    # no delay
    cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
    
    1. 基本方法

    然后您可以让rc.local 脚本使用您的自定义脚本在启动时执行。 您可以按照 RaspberryPi3+ 官方网站的说明进行操作:https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

    1. 另一种方法:创建守护程序服务

    我们将创建一个“网络摄像头流”服务,假设所有必要的 bash 命令都位于/home/pi/Webcam_Record/vlc_webcam_stream_service.sh

    cd /lib/systemd/system/
    sudo nano webcam-stream.service
    

    并写在里面:

    [Unit]
    Description=Custom Webcam Streaming Service
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/home/pi/Webcam_Record/vlc_webcam_stream_service.sh
    Restart=on-abort
    
    [Install]
    WantedBy=multi-user.target
    

    使服务文件和脚本可执行:

    sudo chmod 644 /lib/systemd/system/webcam-stream.service
    chmod +x /home/pi/Webcam_Record/vlc_webcam_stream.sh
    

    允许 VLC 以 ​​root 身份执行:

    sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc
    

    重新加载守护进程并启用我们的服务:

    sudo systemctl daemon-reload
    sudo systemctl enable webcam-stream.service
    

    检查它是否被识别并正常工作:

    sudo service webcam-stream status
    sudo service webcam-stream start
    

    您可以使用另一台计算机检查视频是否正确流式传输。 请注意,服务运行时网络摄像头将不可用。


    完成后,您可以连接到 RaspberryPi3+ wifi 接入点并访问您的视频流。


    6。 [编辑] 附加命令:无限循环录制和分割视频

    以下 bash 脚本允许无限录制 15 秒长的带有时间戳文件名和流式传输的视频

    #!/bin/bash
    # auto stream launch + led off
    #cvlc -vvv for verbose debug
    
    # adapt to video device name
    deviceNb=1
    
    # loop duration
    duration=15
    
    #infinite recording
    #loopOption=
    loopOption=--loop
    
    # force video format + led off
    v4l2-ctl -d ${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0
    
    # if delay needed :live-caching=2500
    cvlc --sout-file-format --run-time=${duration} ${loopOption} v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/%F_%T_Spy.mp4'}:dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
    

    7. [编辑] 给定时刻的程序执行

    2018 年 8 月 4 日编辑

    要在今天 14:00 启动执行,您可以使用以下命令:

    ./my_vlc_webcam_script.sh | at 1400
    

    有关详细信息,请参阅at 命令手册。


    8。疑难解答

    2018 年 7 月 7 日编辑

    我最近在 dist 升级后遇到了 VLC 错误:

    VLC media player 2.2.6 Umbrella (revision 2.2.6-0-g1aae78981c)
    [00acb230] pulse audio output error: PulseAudio server connection failure: Connection refused
    

    我找到的解决方案是在 GUI 模式下启动 VLC 并将默认音频设备更改为 ALSA(而不是自动)。我也可以在命令行中完成。 请参阅此处找到的解决方案VLC issues with PulseAudio

    cvlc -A alsa,none --alsa-audio-device default
    

    【讨论】:

    • 我希望我能多次对此表示赞同。这东西的配置真的很复杂,这是我第一次看到全面的解释。
    • 我遇到了您提供的 bash 文件的声音问题。我第一次执行脚本时没有录制声音。视频有效,没有声音。如果我终止 pi 上的流,然后再次启动,则声音第二次起作用。声音也适用于随后的时间。我已经看到有些人遇到了相反的问题,它最初可以工作,然后以后就不能工作了。我认为这是同一个问题,但这就是它以脉冲音频作为默认值的表现方式。我将 VLC 默认设置为 ALSA,但不知何故有相反的问题。
    • 嗨,我的 Pi 没有遇到这种问题。你的 Pi 是最新的(发行版和软件包)吗?
    • 或者你有另一个优先于设备的程序?
    • 今天尝试让它工作,但必须打破某些问题led1_mode (menu) : min=0 max=3 default=3 value=3 不再出现在网络摄像头功能中...
    【解决方案2】:

    您需要vcodec= 才能播放视频,如果需要,您需要deinterlace

    cvlc v4l2:///dev/video0:chroma=h264
                           :input-slave=alsa://hw:1,0
                           :live-caching=2500
    --sout '#transcode{
                         deinterlace,
                         vcodec=mpgv,
                         acodec=mpga,
                         ab=128,
                         channels=2,
                         samplerate=44100,
                         threads=4,
                         audio-sync=1}
           :standard{
                         access=http,
                         mux=ts,
                         mime=video/ts,
                         dst=0.0.0.0:8099}'
    

    【讨论】:

    • 终端将输入选项读取为一行,因此请谨慎使用。 cvlc v4l2:///dev/video0:chroma=h264:input-slave=alsa://hw:1,0:live-caching=200 --sout '#transcode{deinterlace,vcodec=h264,acodec=mp3,ab=128,channels=2,samplerate=44100, threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=0.0.0.0:8099}'
    • 我在我的设置中没有看到这项工作 -- 还不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多