8.4 多媒体处理与应用
本节主要解答与地瓜RDK板卡上视频编解码、音频处理以及其他多媒体功能相关的常见疑问。
视频编解码
Q1: 开发板解码RTSP视频流时报错(如下图所示),可能是什么原因?
A: RTSP视频流解码报错,常见原因及解决方法如下:
- 码流缺少PPS和SPS参数信息:
- 原因: 推流服务器推送的RTSP码流(尤其是H.264格式)中必须包含
PPS
(Picture Parameter Set) 和SPS
(Sequence Parameter Set) 参数信息,解码器需要这些信息来正确解析视频。 - 解决方法:
- 如果您使用
ffmpeg
从视频文件(如.mp4
,.avi
)推流,建议在命令中添加-bsf:v h264_mp4toannexb
(H.264 Bitstream Filter: MP4 to Annex B) 选项(注意:较新版本的ffmpeg中-vbsf
已被-bsf:v
替代)。这个过滤器会自动为码流添加PPS
和SPS
信息。ffmpeg
推流命令示例:(请将ffmpeg -re -stream_loop -1 -i xxx.mp4 -c:v copy -bsf:v h264_mp4toannexb -f rtsp rtsp://192.168.1.195:8554/h264_stream
xxx.mp4
替换为您的视频文件名,并将RTSP服务器地址rtsp://192.168.1.195:8554/h264_stream
替换为实际地址。)
- 如果您使用
- 原因: 推流服务器推送的RTSP码流(尤其是H.264格式)中必须包含
- 分辨率支持限制:
- 目前RDK板卡对RTSP视频流的解码可能仅支持到特定的分辨率,例如 1080p (1920x1080)。请确认您的RTSP流分辨率是否在此支持范围内。查阅您板卡型号的具体文档以获取准确支持列表。
- 推流软件兼容性:
- 不推荐使用VLC直接推流: 使用VLC软件直接进行RTSP推流可能无法成功被RDK解码,原因是VLC在某些配置下可能不支持在推流时主动添加或确保
PPS
和SPS
信息。建议使用ffmpeg
或其他能确保码流参数完整性的专业推流工具。
- 不推荐使用VLC直接推流: 使用VLC软件直接进行RTSP推流可能无法成功被RDK解码,原因是VLC在某些配置下可能不支持在推流时主动添加或确保
Audio 常见问题
Q1: 示例中使用了tinyalsa,它的各个参数代表什么含义?如何使用?
A: tinyalsa
是一个轻量级的音频库,主要用于Android和嵌入式Linux系统。它提供了对ALSA(Advanced Linux Sound Architecture)的简化接口,便于开发者进行音频处理。
以下是一些常用的 tinyalsa
命令及其参数含义:
- 列出所有声卡:
这个命令会列出系统中所有已识别的声卡及其控件。
tinymix -l
- 列出特定声卡的控件:
其中
tinymix -c <card_number> -l
<card_number>
是声卡的序号。这个命令会列出指定声卡的所有控件。 - 获取特定控件的值:
这个命令会显示指定声卡上某个控件的当前值。例如:
tinymix -c <card_number> <control_name>
这将显示声卡0上名为tinymix -c 0 'ADC PGA Gain'
ADC PGA Gain
的控件的当前值。 - 设置特定控件的值:
这个命令会设置指定声卡上某个控件的值。例如:
tinymix -c <card_number> <control_name> <value>
这将把声卡0上名为tinymix -c 0 'ADC PGA Gain' 80%
ADC PGA Gain
的控件设置为80%。 - 查看当前音频状态:
这个命令会显示指定声卡的当前音频状态,包括所有控件的当前值。
tinymix -c <card_number> -s
- 播放音频文件:
这个命令会播放指定的音频文件。
tinyplay <file_name>
<file_name>
是音频文件的路径和名称。 例如:这将播放指定的音频文件。tinyplay /path/to/audio.wav
- 录制音频:
这个命令会录制音频并保存到指定文件。各参数含义如下:
tinycap <file_name> -D <card_number> -d <device_number> -c <channels> -b <bit_depth> -r <sample_rate> -p <period_size> -n <periods> -t <duration>
<file_name>
: 录制的音频文件名。-D <card_number>
: 指定声卡序号。-d <device_number>
: 指定设备序号(通常是PCM设备)。-c <channels>
: 指定录音通道数(例如2表示立体声,4表示四通道)。-b <bit_depth>
: 指定音频位深(例如16表示16位)。-r <sample_rate>
: 指定采样率(例如48000表示48kHz)。-p <period_size>
: 指定每个周期的大小(以帧为单位)。-n <periods>
: 指定周期数。-t <duration>
: 指定录音持续时间(以秒为单位)。- 示例:
这个命令会使用声卡0的设备1录制2通道16位48kHz的音频,持续5秒,并保存为tinycap ./recorded_audio.wav -D 0 -d 1 -c 2 -b 16 -r 48000 -p 512 -n 4 -t 5
recorded_audio.wav
文件。
Q2: RDK板卡上如何区分和使用USB声卡与板载声卡?特别是当同时连接了多种音频设备时。
A: 当RDK板卡上同时连接了板载声卡(例如通过音频子板)和USB声卡时,Linux音频系统(ALSA)会为它们分配不同的声卡序号。您需要知道正确的声卡序号才能精确控制特定的音频设备。
-
查看已识别的声卡及其序号: 使用以下命令可以列出系统中所有已识别的声卡及其对应的序号和名称:
cat /proc/asound/cards
示例输出 (假设USB声卡先注册,板载声卡后注册):
0 [RC08 ]: USB-Audio - ROCWARE RC08
ROCWARE RC08 at usb-xhci-hcd.2.auto-1.2, high speed
1 [duplexaudio ]: simple-card - duplex-audio
duplex-audio在这个示例中:
- USB声卡
ROCWARE RC08
被分配为声卡序号 0。 - 板载声卡
duplexaudio
(这通常是RDK音频子板的名称) 被分配为声卡序号 1。 - 注意: 声卡序号的分配顺序可能因设备插入顺序、驱动加载顺序等因素而变化。如果USB声卡是在系统启动后插入的,它可能会获得一个较大的序号。
- USB声卡
-
使用
amixer
或tinymix
指定声卡进行操作:- 当您使用
amixer
(ALSA Mixer command-line utility) 或tinymix
等工具来查看或调整音频参数时,如果不指定声卡(card)和设备(device)编号,它们通常会默认操作序号为0的声卡。 - 要操作特定的声卡,需要使用
-c <card_number>
(或-c<card_number>
) 参数指定声卡序号,以及可能需要的-D hw:<card_number>
或-d <device_number>
参数。 - 查看特定声卡(如上述示例中的板载声卡,序号为1)的控件 (controls):
amixer -c 1 controls
# 或者使用硬件设备名: amixer -D hw:1 controls - 获取或设置特定声卡上控件的值 (例如,获取板载声卡序号1上名为 'ADC PGA Gain' 的第一个控件的值):
要设置值,可以使用
amixer -c 1 sget 'ADC PGA Gain',0
sset
代替sget
,例如:amixer -c 1 sset 'ADC PGA Gain',0 80%
。
- 当您使用
通过以上方法,您可以准确地识别并控制连接到RDK板卡上的不同音频设备。