You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python FFmpeg实现摄像头多分辨率HLS推流报错求助

摄像头采集生成多分辨率HLS流失败排查

我目前能通过摄像头采集视频流生成单分辨率HLS流,但配置多分辨率时出现错误。

错误日志

C:\Users\ltadic\Desktop\hls stream>C:/Users/ltadic/AppData/Local/Programs/Python/Python311/python.exe "c:/Users/ltadic/Desktop/hls stream/camera_stream.py"
ERROR:root:ffmpeg failed to execute command: b"ffmpeg version 2022-12-11-git-c3e20f78b0-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers\r\n  built with gcc 12.1.0 (Rev2, Built by MSYS2 project)\r\n 
 configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint\r\n  libavutil      57. 43.100 / 57. 43.100\r\n  libavcodec     59. 55.100 / 59. 55.100\r\n  libavformat    59. 34.102 / 59. 34.102\r\n  libavdevice    59.  8.101 / 59.  8.101\r\n  libavfilter     8. 52.100 /  8. 52.100\r\n  libswscale      6.  8.112 /  6.  8.112\r\n  libswresample   4.  9.100 /  4.  9.100\r\n  libpostproc    56.  7.100 / 56.  7.100\r\nInput #0, dshow, from 'video=Fantech Luminous C30':\r\n  Duration: N/A, start: 1593.585118, bitrate: N/A\r\n  Stream #0:0: Video: mjpeg (Baseline) (MJPG / 0x47504A4D), yuvj420p(pc, bt470bg/bt709/unknown), 1920x1080, 25 fps, 25 tbr, 10000k tbn\r\n[dshow @ 0000018b1c4d4280] Could not run graph (sometimes caused by a device already in use by other application)\r\nvideo=Fantech Luminous C30: I/O error\r\n"
Traceback (most recent call last):
  File "c:\Users\ltadic\Desktop\hls stream\camera_stream.py", line 13, in <module>
    hls.output('C:\\Users\\ltadic\\Desktop\\camera_stream\\hls1.m3u8')
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\site-packages\ffmpeg_streaming\_media.py", line 93, in output
    self.run(ffmpeg_bin, monitor, **options)
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\site-packages\ffmpeg_streaming\_media.py", line 121, in run  
    asyncio.run(self.async_run(ffmpeg_bin, monitor, **options))
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 650, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\site-packages\ffmpeg_streaming\_media.py", line 112, in async_run
    self._run(ffmpeg_bin, monitor, **options)
  File "C:\Users\ltadic\AppData\Local\Programs\Python\Python311\Lib\site-packages\ffmpeg_streaming\_media.py", line 106, in _run
    self.pipe, err = process.run()

实现代码

import ffmpeg_streaming
from ffmpeg_streaming import Formats,Bitrate, Representation, Size 

video = ffmpeg_streaming.input('Fantech Luminous C30', capture = True)

_360p  = Representation(Size(640, 360), Bitrate(276 * 1024, 128 * 1024))
_480p  = Representation(Size(854, 480), Bitrate(750 * 1024, 192 * 1024))
_720p  = Representation(Size(1280, 720), Bitrate(2048 * 1024, 320 * 1024))

hls = video.hls(Formats.h264(),hls_list_size=10, hls_time=5)
hls.flags('delete_segments')
hls.representations(_360p, _480p, _720p)
hls.output('C:\\Users\\ltadic\\Desktop\\camera_stream\\hls1.m3u8')

问题排查与解决方案

从错误日志中的[dshow @ 0000018b1c4d4280] Could not run graph (sometimes caused by a device already in use by other application)和video=Fantech Luminous C30: I/O error可知,核心问题是摄像头设备被占用,或是ffmpeg处理多分辨率流时重复尝试打开摄像头导致冲突。

解决步骤:

  • 释放摄像头占用:关闭所有可能使用该摄像头的应用(如视频通话软件、系统相机、其他调试程序),再重新运行脚本。
  • 优化输入参数:多分辨率编码需要对同一输入源进行多路处理,可添加输入缓存参数避免重复打开设备,修改输入初始化代码:
    video = ffmpeg_streaming.input('Fantech Luminous C30', capture=True, thread_queue_size=1024)
    
  • 降低编码压力:同时编码3路分辨率对硬件性能要求较高,若设备性能不足,可先减少分辨率数量(如仅保留2路),或降低每路的码率/帧率,测试是否正常运行。
  • 验证设备名称:通过命令ffmpeg -list_devices true -f dshow -i dummy查看系统中摄像头的准确名称,确保代码中设备名称拼写完全正确。

内容的提问来源于stack exchange,提问作者LUKA TADIĆ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:53