多媒体使用指南#
概述#
本指南旨在帮助用户了解和使用K230 Linux多媒体功能。主要内容包括如何使用V4L2 VPU(视频处理单元)和ALSA音频接口。指南中提供了直接调用V4L2和ALSA接口的示例代码,并介绍了如何使用FFmpeg工具进行多媒体处理,包括调用VPU和ALSA方法的详细步骤。
通过本指南,用户将能够:
掌握V4L2 VPU的使用方法,包括视频捕获、编码和解码,并提供v4l2视频编解码示例演示
使用V4L2和DRM完成单路、多路摄像头预览以及ISP场景切换
学习ALSA音频接口的使用,包括音频采集和播放,并提供alsa音频采集播放示例演示
使用FFmpeg进行多媒体文件的转换和处理,并介绍如何调用VPU和ALSA方法
了解K230提供的摄像头视频流传输方案,支持RTSP和WebRTC两种协议,并配有对应的demo程序
V4L2摄像头显示Demo#
VVCAM(V4L2 Camera)是K230的摄像头驱动框架,提供了三个基于V4L2和DRM
的摄像头显示示例,源码位于
k230_linux_sdk/buildroot-overlay/package/vvcam:
v4l2-drm:基础采集和显示示例,支持裁剪、镜像、旋转以及Sensor输出参数设置。v4l2-drm-three-camera:最多同时采集三路视频,并分别显示到三个DRM video layer。v4l2-drm-scene:采集单路视频,并在运行过程中切换不同的ISP场景配置。
三个程序随VVCAM一起编译并安装到开发板的/usr/bin目录。运行前应确保
isp_media_server和VVCAM相关内核模块已经启动,并通过以下命令确认摄像头
对应的设备节点:
v4l2-ctl --list-devices
Linux动态分配/dev/videoN编号,因此不应仅根据设备号判断摄像头通路。建议
根据vvcam-video.0.N名称确定所需设备,再将实际设备号传给demo。
基础显示Demo#
v4l2-drm通过V4L2采集摄像头图像,并使用DMA-BUF将图像交给DRM显示,
避免CPU拷贝。基本用法如下:
v4l2-drm -d 1 -w 1920 -h 1080 -f NV12 -n 5
常用参数如下:
-d N:打开/dev/videoN。该参数必须写在本路摄像头的其它参数之前。-w、-h:设置输出图像的宽度和高度,默认值为640×480。-n:设置缓冲区数量。-f:设置像素格式,常用值为NV12或NV16,默认值为NV12。-s:只采集而不使用DRM显示。-x、-y、--crop-width、--crop-height:设置裁剪区域。--hflip 0|1、--vflip 0|1:设置Sensor水平或垂直镜像。--rotation N:设置显示旋转方向,0、1、2、3分别表示 0°、90°、180°、270°。--sw、--sh、--sfps:分别设置Sensor的目标输出宽度、高度和帧率。 三个参数必须一起使用,且仅支持单路摄像头。
如需在运行前切换Sensor的目标输出模式,可同时设置目标宽度、高度和帧率:
v4l2-drm -d 1 -w 1280 -h 720 --sw 1280 --sh 720 --sfps 30
程序运行时会在终端输出采集和显示帧率。按d键可将当前帧保存到当前目录,
按q键结束运行。
三路摄像头显示Demo#
v4l2-drm-three-camera最多同时打开三个V4L2设备。每个-d及其后的参数
构成一路配置,可以分别指定显示位置和DRM video layer。下面以三路摄像头
的MP输出当前分别对应/dev/video1、/dev/video4和/dev/video7为例:
v4l2-drm-three-camera \
-d 1 -w 240 -h 240 -x 0 -y 0 -l 1 \
-d 4 -w 240 -h 400 -x 240 -y 0 -l 2 \
-d 7 -w 480 -h 800 -x 480 -y 0 -l 3
实际设备号可能不同,运行前应根据v4l2-ctl --list-devices的输出替换上述
-d参数。三路摄像头应优先选择每路的MP节点。MCM(多摄像头模式)布局是
指系统按摄像头分组注册视频输出节点,每路摄像头依次注册MP、SP1和SP2三个
输出;因此,三路MP的VVCAM entity通常为vvcam-video.0.0、
vvcam-video.0.3和vvcam-video.0.6。有关节点布局的详细说明,请参阅
Sensor切换说明。
每路支持以下参数:
-d N:视频设备号,对应/dev/videoN。-w、-h:该路图像的显示宽度和高度。-n:缓冲区数量。-f:像素格式,支持NV12或NV16。-x、-y:图像在屏幕上的起始坐标。-l 1|2|3:选择K230的video_1、video_2或video_3硬件图层。--rotation 0|1|2|3:设置该路的显示旋转方向。-s:采集该路图像但不显示。
不同摄像头不能使用相同的DRM video layer。程序会实时输出各路采集帧率和
整体显示帧率。按d键可保存各路当前帧,按q键退出。
ISP场景切换Demo#
v4l2-drm-scene用于验证单路摄像头在不同ISP标定参数之间的运行时切换。
程序固定使用NV12格式和5个DMA-BUF,并通过JSON文件描述可用场景:
{
"scenes": [
{
"name": "day",
"calib_dir": "/root/scenes/day",
"mode": 0
},
{
"name": "night",
"calib_dir": "/root/scenes/night",
"mode": 0
}
]
}
其中,name为场景名称,calib_dir为该场景的ISP标定文件目录,mode为
Sensor驱动中的模式索引。配置文件采用简单的逐行解析方式,应保持示例中的
一行一个字段格式。
使用以下命令加载场景配置:
v4l2-drm-scene -d 1 -w 1920 -h 1080 \
-s /root/scenes/scene_config.json
程序运行时支持以下按键:
1~9:切换到对应序号的场景。g:读取并显示当前生效的calib_dir和mode。q:退出程序。
参数说明:
-d N:视频设备号,对应/dev/videoN,默认值为0。-w、-h:采集和显示分辨率,默认值为640×480。-s:场景配置JSON文件的路径。注意,此处的-s不是“禁止显示”。
每个calib_dir目录中应提供与当前Sensor和分辨率匹配的XML、manual JSON
和auto JSON标定文件。isp_media_server按照
{calib_dir}/{sensor}-{width}x{height}规则查找这些文件。
场景切换会关闭并重新打开video设备,通常会产生数百毫秒到约1秒的黑屏。
不同场景只能调整曝光、增益、白平衡、gamma、降噪、锐化等ISP模块内部
参数,不能改变ISP子模块的启用状态。所有场景中各ISP模块的启用和禁用组合
必须保持一致,否则多次切换后可能导致libcam_engine异常。
V4L2 VPU使用指南#
视频编码#
在本节中,我们将演示如何使用VPU(视频处理单元)对NV12格式的图像进行编码。图像来源可以是从摄像头采集到的画面,也可以是其他文件作为编码器的视频输入源。
编码器demo介绍#
mvx_encoder 是一款利用 VPU(视频处理单元)进行硬件加速的视频编码命令行工具。它支持 H.264、H.265 和 JPEG 等编码格式,通过 V4L2(Video for Linux 2)接口与硬件设备交互,实现高效的编码性能。源码位于 k230_linux_sdk/buildroot-overlay/package/mvx_player。
使用以下命令将raw编码:
mvx_encoder --dev <vpu_device> -i <input_format> -w <width> -h <height> -o <output_format> <input_file> <output_file>
其中:
--dev <vpu_device>:指定 vpu 设备路径。-i <input_format>:指定输入图像格式。-w <width> -h <height>:设置图像分辨率。-o <output_format>:指定输出视频格式。<input_file>:输入的图像文件。<output_file>:输出的视频文件。
执行上述命令后,输入的图像文件 <input_file> 将被编码为指定格式的视频文件 <output_file>。
除了基本用法,mvx_encoder 还支持调整编码质量、设置比特率、指定编码帧率等高级功能。使用以下命令可查看完整的参数列表:
mvx_encoder -help
查找VPU设备#
在使用VPU进行视频处理之前,需要先查找摄像头设备和VPU设备。可以使用以下命令列出所有视频设备:
v4l2-ctl --list-devices
示例输出:
Linlon Video device (platform:mvx):
/dev/video0
Canaan nonai 2D (platform:nonai-2d):
/dev/video5
vvcam-isp-subdev.0 (platform:vvcam-isp-subdev.0):
/dev/v4l-subdev0
verisilicon_media (platform:vvcam-video.0):
/dev/media0
vvcam-video.0.0 (platform:vvcam-video.0.0):
/dev/video1
vvcam-video.0.1 (platform:vvcam-video.0.1):
/dev/video2
vvcam-video.0.2 (platform:vvcam-video.0.2):
/dev/video3
vvcam-video.0.3 (platform:vvcam-video.0.3):
/dev/video4
在上述输出中:
/dev/video0为编解码器设备。/dev/video1为摄像头设备。
通过这些信息,您可以确定要使用的设备路径,以便在后续步骤中进行视频捕获和编码操作。
通过以下命令验证摄像头是否正常工作(需要通过HDMI接口外接显示器):
v4l2-drm -d 1 -w 480 -h 320
如果显示器上可以看到摄像头的实时画面,则说明摄像头工作正常。
使用摄像头采集画面并进行编码#
首先,我们将使用摄像头采集画面并保存为NV12格式的图像。接着,通过VPU对这些图像进行编码。请确保有足够的存储空间来保存图像,建议通过NFS挂载外部存储设备。
视频采集#
使用以下命令捕获摄像头画面并保存为NV12格式的图像,分辨率为1080p,捕获25帧图像。 请确保数据写入速度快于摄像头的采集速度,否则请降低摄像头的分辨率。
v4l2-ctl --device=/dev/video1 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 --stream-mmap --stream-count=25 --stream-to=output.yuv
其中:
--device=/dev/video1:指定摄像头设备,可以根据实际情况调整。--set-fmt-video=width=1920,height=1080,pixelformat=NV12:设置视频格式为1080p分辨率和NV12像素格式。--stream-mmap:使用内存映射方式进行视频流处理。--stream-count=25:指定捕获25帧图像。--stream-to=output.yuv:将捕获的图像保存到output.yuv文件中。
视频编码#
使用以下命令将捕获的NV12格式图像通过VPU进行编码为H.264格式的视频文件:
mvx_encoder --dev /dev/video0 -i yuv420_nv12 -w 1920 -h 1080 -o h264 ./output.yuv ./test.264
#mvx_encoder --dev /dev/video0 -i yuv420_nv12 -w 1920 -h 1080 -o h265 ./output.yuv ./test.265
#mvx_encoder --dev /dev/video0 -i yuv420_nv12 -w 1920 -h 1080 -o jpeg ./output.yuv ./test.jpg
其中:
--dev /dev/video0:指定VPU设备。-i yuv420_nv12:指定输入图像格式为NV12。-w 1920 -h 1080:设置图像分辨率为1920x1080。-o h264:指定输出视频格式为H.264。./output.yuv:输入的NV12格式图像文件。./test.264:输出的H.264格式视频文件。
执行上述命令后,摄像头捕获的25帧NV12格式图像将被编码为H.264格式的视频文件test.264。可将该文件复制到PC上,使用播放器(如PotPlayer)验证编码效果。
使用本地文件进行编码#
如果您有本地的NV12格式图像文件,也可以使用VPU进行编码。只需将上述命令中的输入文件路径替换为本地文件路径即可。
通过这些步骤,您可以轻松地使用VPU对NV12格式的图像进行编码,无论图像来源是摄像头还是本地文件。
视频解码#
在本节中,我们将演示如何使用VPU(视频处理单元)对NV12格式的H.264文件进行解码。图像来源可以是视频编码章节生成的文件,也可以是您自己准备的文件。
解码器demo介绍#
mvx_decoder 是一款利用 VPU(视频处理单元)进行硬件加速的视频解码命令行工具。它支持 H.264、H.265 和 JPEG 等解码格式,通过 V4L2(Video for Linux 2)接口与硬件设备交互,实现高效的解码性能。源码位于 k230_linux_sdk/buildroot-overlay/package/mvx_player。
使用以下命令将视频文件解码为图像:
mvx_decoder --dev <vpu_device> -i <input_format> -o <output_format> <input_file> <output_file>
其中:
--dev <vpu_device>:指定 VPU 设备路径。-i <input_format>:指定输入图像格式。-o <output_format>:指定输出图像格式。<input_file>:输入的视频文件。<output_file>:输出的图像文件。
执行上述命令后,输入的视频文件 <input_file> 将被解码为指定格式的图像文件 <output_file>。
除了基本用法,mvx_decoder 还支持调整解码参数等高级功能。使用以下命令可查看完整的参数列表:
mvx_decoder -help
视频解码#
在解码之前,请先确认VPU设备,具体参考查找VPU设备章节。
使用以下命令将H.264格式的视频文件解码为NV12格式的图像文件:
mvx_decoder --dev /dev/video0 -i h264 -o yuv420_nv12 test.264 output.yuv
其中:
--dev /dev/video0:指定VPU设备。-i h264:指定输入视频格式为H.264。-o yuv420_nv12:指定输出图像格式为NV12。test.264:输入的H.264格式视频文件。output.yuv:输出的NV12格式图像文件。
执行上述命令后,输入的H.264格式视频文件test.264将被解码为NV12格式的图像文件output.yuv。可以将该文件复制到PC上,使用支持NV12格式的播放器(如YUVView)验证解码效果。
ALSA音频使用指南#
audio demo介绍#
audio_demo 是一个运行在 K230 开发板上的示例程序,通过调用 ALSA(Advanced Linux Sound Architecture)API,实现音频的录制和播放功能。该示例程序不仅展示了如何在 K230 开发板上进行音频处理,还为开发者提供了使用 ALSA API 接口实现音频功能的参考代码。
录制 WAV 文件#
使用以下命令录制一个 WAV 格式的音频文件:
audio_demo -type 2 -filename test.wav -channels 2 -samplerate 16000
参数说明:
-type 2:指定操作类型为录制。-filename:设置输出文件名。-channels:录制通道数,2为双声道。-samplerate:设置采样率,单位为 Hz。
录制完成后,音频文件保存在当前目录下的 test.wav 中。
播放 WAV 文件#
使用以下命令播放录制的 WAV 文件:
audio_demo -type 0 -filename test.wav
参数说明:
-type 0:指定操作类型为播放 WAV 文件。-filename:要播放的文件名。
播放 MP3 文件#
audio_demo 也支持播放 MP3 格式的音频文件:
audio_demo -type 1 -filename example.mp3
参数说明:
-type 1:指定操作类型为播放 MP3 文件。-filename:要播放的 MP3 文件名。
声音采集和播放#
audio_rec_play 是一个用于声音采集和播放的示例程序,模拟 K230 端的语音通话场景,并通过 audio3a 实现声音质量增强。该程序在前 30 秒启动录音和播放本地文件(可以通过耳机接口连接外部扬声器或功放设备),在后 30 秒将录制的声音播放,以检测声音效果。
使用以下命令运行 audio_rec_play:
audio_rec_play
默认情况下,程序会播放 /usr/bin/audio.pcm 文件。
程序运行流程如下:
前 30 秒:启动录音并播放本地文件
/usr/bin/audio.pcm。后 30 秒:停止播放本地文件,将前 30 秒录制的声音进行播放,以检测声音效果。
通过该示例程序,用户可以体验 K230 端的声音采集和播放功能,并验证 audio3a 的声音质量增强效果。
使用FFmpeg进行多媒体处理#
在本节中,我们将演示如何使用FFmpeg调用VPU实现硬件编解码,以及如何使用FFmpeg调用ALSA接口实现音频录制和播放。
采集摄像头视频并编码#
使用以下命令,通过FFmpeg采集摄像头视频,并调用VPU编码保存为MP4文件:
ffmpeg -f v4l2 -input_format nv12 -r 30 -s 1920x1080 -i /dev/video1 -c:v h264_v4l2m2m -b:v 4M -vsync passthrough -y test.mp4
其中:
-f v4l2:指定视频输入格式为V4L2。-input_format nv12:指定输入图像格式为NV12。-r 30:设置帧率为30fps。-s 1920x1080:指定分辨率为1920x1080。-i /dev/video1:指定摄像头设备路径。-c:v h264_v4l2m2m:使用VPU进行H.264编码-b:v 4M:设置视频码率为4Mbps。-vsync passthrough:同步视频帧。-y test.mp4:输出文件名为test.mp4。
h264_v4l2m2m/hevc_v4l2m2m/mjpeg_v4l2m2m 是 FFmpeg 中的一个硬件加速视频编码器,利用 V4L2(Video for Linux 2)和 M2M(Memory-to-Memory)接口实现高效的视频编码。通过与硬件设备交互,提供更高的编码性能和效率。
执行上述命令后,摄像头采集的视频将被编码为H.264格式并保存为test.mp4文件。
抓拍摄像头图像#
使用以下命令,通过FFmpeg采集摄像头图像,并调用VPU编码保存为JPEG文件:
ffmpeg -f v4l2 -input_format nv12 -s 1920x1080 -i /dev/video1 -vframes 10 -vf format=nv12 -c:v mjpeg_v4l2m2m -vsync passthrough -y output_%03d.jpg
其中:
-f v4l2:指定视频输入格式为V4L2。-input_format nv12:指定输入图像格式为NV12。-s 1920x1080:指定分辨率为1920x1080。-i /dev/video1:指定摄像头设备路径。-vframes 10:设置抓拍的帧数为10帧。-vf format=nv12:设置图像格式为NV12。-c:v mjpeg_v4l2m2m:使用VPU进行JPEG编码。-vsync passthrough:同步视频帧。-y output_%03d.jpg:输出文件名格式为output_001.jpg、output_002.jpg等。
执行上述命令后,摄像头采集的图像将被编码为JPEG格式,并保存为多个文件,如output_001.jpg、output_002.jpg等。
抓拍摄像头图像并保存为MJPEG文件#
使用以下命令,通过FFmpeg采集摄像头图像,并调用VPU编码保存为MJPEG文件:
ffmpeg -f v4l2 -input_format nv12 -s 1920x1080 -i /dev/video1 -vframes 100 -vf format=nv12 -c:v mjpeg_v4l2m2m -vsync passthrough -y output.mjpeg
其中:
-f v4l2:指定视频输入格式为V4L2。-input_format nv12:指定输入图像格式为NV12。-s 1920x1080:指定分辨率为1920x1080。-i /dev/video1:指定摄像头设备路径。-vframes 100:设置抓拍的帧数为100帧。-vf format=nv12:设置图像格式为NV12。-c:v mjpeg_v4l2m2m:使用VPU进行MJPEG编码。-vsync passthrough:同步视频帧。-y output.mjpeg:输出文件名为output.mjpeg。
执行上述命令后,摄像头采集的图像将被编码为MJPEG格式,并保存为output.mjpeg文件。
解码视频并保存为图像#
使用以下命令,通过FFmpeg解码H.264格式的视频文件,并保存为NV12格式的图像:
ffmpeg -c:v h264_v4l2m2m -i test.mp4 -pix_fmt nv12 -f rawvideo -vsync passthrough -y output.yuv
其中:
-c:v h264_v4l2m2m:使用VPU进行H.264解码。-i input.mp4:指定输入的视频文件。-pix_fmt nv12:指定输出图像格式为NV12。-f rawvideo:指定输出格式为原始视频流。output.yuv:输出文件名为output.yuv。
执行上述命令后,输入的H.264格式视频文件input.mp4将被解码为NV12格式的图像文件output.yuv。可以将该文件复制到PC上,使用支持NV12格式的播放器(如YUVView)验证解码效果。
录制声音#
使用以下命令,通过FFmpeg调用ALSA接口录制声音,并保存为WAV文件:
ffmpeg -f alsa -i hw:0 -t 30 -ac 2 -ar 44100 -y output.wav
其中:
-f alsa:指定音频输入格式为ALSA。-i hw:0:指定音频输入设备,hw:0表示默认音频设备。-t 30:设置录制时长为30秒。-ac 2:设置录制通道数为2(立体声)。-ar 44100:设置采样率为44100Hz。-y output.wav:输出文件名为output.wav。
执行上述命令后,录制的声音将保存为WAV格式的音频文件output.wav。
播放声音#
使用以下命令,通过FFmpeg调用ALSA接口播放录制的WAV文件:
ffmpeg -f wav -i output.wav -f alsa hw:0
其中:
-f wav:指定音频输入格式为WAV。-i output.wav:指定输入的WAV文件。-f alsa:指定音频输出格式为ALSA。hw:0:指定音频输出设备,hw:0表示默认音频设备。
执行上述命令后,录制的WAV文件output.wav将通过ALSA接口播放。
调整音量#
调整录制音量#
使用以下命令,通过FFmpeg调用ALSA接口录制声音,并调整采集音量:
ffmpeg -f alsa -i hw:0 -t 30 -ac 2 -ar 44100 -filter:a "volume=2.0" -y output.wav
其中:
-f alsa:指定音频输入格式为ALSA。-i hw:0:指定音频输入设备,hw:0表示默认音频设备。-t 30:设置录制时长为30秒。-ac 2:设置录制通道数为2(立体声)。-ar 44100:设置采样率为44100Hz。-filter:a "volume=2.0":调整采集音量,2.0表示音量增大一倍。-y output.wav:输出文件名为output.wav。
执行上述命令后,录制的声音将保存为WAV格式的音频文件output.wav,并且音量将增大一倍。
调整播放音量#
使用以下命令,通过FFmpeg调用ALSA接口播放声音,并调整播放音量:
ffmpeg -f wav -i output.wav -filter:a "volume=2.0" -f alsa hw:0
其中:
-f wav:指定音频输入格式为WAV。-i output.wav:指定输入的WAV文件。-filter:a "volume=2.0":调整播放音量,2.0表示音量增大一倍。-f alsa:指定音频输出格式为ALSA。hw:0:指定音频输出设备,hw:0表示默认音频设备。
执行上述命令后,WAV文件output.wav将通过ALSA接口播放,并且音量将增大一倍。
静音#
以下命令将使用 FFmpeg 调用 ALSA 播放音频文件 output.wav,并且静音输出,使用硬件设备 hw:0。
ffmpeg -i output.wav -f alsa -ac 2 -ar 44100 -vol 0 hw:0
其中:
-i output.wav:指定输入文件为output.wav。-f alsa:指定输出格式为 ALSA。-ac 2:指定音频通道数为 2。-ar 44100:指定音频采样率为 44100 Hz。-vol 0:将音量设置为 0,实现静音播放。hw:0:指定使用硬件设备hw:0。
摄像头视频流传输#
K230 提供了两种摄像头视频流传输方案,分别基于 RTSP 协议和 WebRTC 协议,并配有对应的 demo 程序:
传输协议 |
Demo 程序 |
源码路径 |
播放方式 |
适用场景 |
|---|---|---|---|---|
RTSP |
|
|
VLC、FFplay 等支持 RTSP 协议的播放器 |
局域网监控、NVR 系统集成 |
WebRTC |
|
|
浏览器直接打开网页 |
低延迟实时预览、Web 应用集成 |
两种方案均支持摄像头采集、VPU 硬件编码(H.264/H.265)和 OSD 叠加功能。下面分别介绍各 demo 的使用方法。
RTSP 推流 Demo#
camera_rtsp_demo 是一个示例程序,用于通过 RTSP 协议传输摄像头视频流。该程序能够将摄像头捕获的视频编码为 H.264 或 H.265 格式,并通过 RTSP 协议进行实时传输。它展示了如何使用 FFmpeg API 获取摄像头数据,叠加OSD并进行编码,以及如何使用 live555 API 输出 RTSP 流。
使用方法#
使用以下命令运行 camera_rtsp_demo:
./camera_rtsp_demo [-H] [-t <codec_type>] [-w <width>] [-h <height>] [-b <bitrate_kbps>] [-l <enable_log>] [-r <osd_region>]
参数说明:
-H:显示帮助信息。-t <codec_type>:指定视频编码类型,可选值为h264或h265,默认值为h264。-w <width>:指定视频编码宽度,默认值为1280。-h <height>:指定视频编码高度,默认值为720。-b <bitrate_kbps>:指定视频编码比特率(kbps),默认值为2000。-l <enable_log>:是否启用日志输出,可选值为0或1,默认值为0。-r <osd_region>:指定叠加OSD区域的数量,默认值为0。
示例命令:
./camera_rtsp_demo -t h264 -w 1920 -h 1080 -b 4000 -r 2
执行上述命令后,程序将启动摄像头并将视频流编码为 H.264 格式,分辨率为 1920x1080,比特率为 4000 kbps,叠加2个区域的OSD,通过 RTSP 协议进行传输。
在串口输出中找到 RTSP URL,例如:”Play this stream using the URL: rtsp://<your_device_ip>:8554/test”,并使用支持 RTSP 协议的播放器(如 VLC)打开该 URL 以查看视频流。
如需了解 RTSP 服务端的完整 API 接口(包括会话管理、音视频数据发送、音频反向通道等),请参考 RTSP Server API 手册。
WebRTC 推流 Demo#
camera_webrtc_demo 是一个示例程序,用于通过 WebRTC 协议传输摄像头视频流。该程序将摄像头捕获的视频编码为 H.264 格式,并通过 WebRTC 协议进行实时传输。它内置了一个 HTTP 服务器,用于 WebRTC 的 SDP 信令交换,同时提供 Web 播放页面,用户可直接在浏览器中查看视频流。底层使用 libpeer 库实现 WebRTC 通信。
与 RTSP 方案相比,WebRTC 方案的主要优势在于:用户无需安装专用播放器,直接通过浏览器即可查看实时视频流,部署和使用更加便捷,同时 WebRTC 天然具有更低的端到端延迟。
使用方法#
使用以下命令运行 camera_webrtc_demo:
./camera_webrtc_demo [-H] [-w <width>] [-h <height>] [-b <bitrate_kbps>] [-p <port>] [-l <enable_log>] [-r <osd_region>]
参数说明:
-H:显示帮助信息。-w <width>:指定视频编码宽度,默认值为1280。-h <height>:指定视频编码高度,默认值为720。-b <bitrate_kbps>:指定视频编码比特率(kbps),默认值为2000。-p <port>:指定 HTTP 服务器端口,用于 WebRTC 信令交换和 Web 页面访问,默认值为8080。-l <enable_log>:是否启用日志输出,可选值为0或1,默认值为0。-r <osd_region>:指定叠加OSD区域的数量,默认值为0。
示例命令:
./camera_webrtc_demo -w 1920 -h 1080 -b 4000 -p 8080 -r 2
执行上述命令后,程序将启动摄像头并将视频流编码为 H.264 格式,分辨率为 1920x1080,比特率为 4000 kbps,叠加2个区域的OSD,通过 WebRTC 协议进行传输。
在串口输出中找到访问地址,例如:
========================================
Camera WebRTC Demo
========================================
Encode: 1920x1080 @ 4000kbps H264
Open in browser:
http://192.168.1.100:8080
========================================
在同一网络下的电脑或手机浏览器中打开该地址,即可查看摄像头的实时视频流。
如需了解 WebRTC 底层 libpeer 库的完整 API 接口(包括 PeerConnection 管理、信令交互、DataChannel 通信等),请参考 WebRTC API 手册。
