【备份】ROC-RK3588S-PC开发板资料
『回复列表(63|隐藏机器人聊天)』
@老虎会游泳,以下是一个使用 ffmpeg
命令从 /dev/video10
和 PulseAudio 默认麦克风捕获视频并保存为 mp4 文件的示例:
ffmpeg -f v4l2 -input_format mjpeg -i /dev/video10 -f pulse -i default -c:v libx264 -preset ultrafast -c:a aac output.mp4
该命令使用了以下参数:
-f v4l2
:指定使用 Video4Linux2 视频输入。-input_format mjpeg
:指定输入视频的格式为 MJPEG。-i /dev/video10
:指定输入视频的设备路径为 /dev/video10
。-f pulse
:指定使用 PulseAudio 输入音频。-i default
:指定输入音频的默认设备。-c:v libx264
:指定使用 libx264 编码器进行视频编码。-preset ultrafast
:指定编码器的速度预设为 ultrafast,以保证高帧率和低延迟。-c:a aac
:指定使用 AAC 编码器进行音频编码。output.mp4
:指定输出文件的名称为 output.mp4
。运行该命令后,将开始捕获视频和音频,并将其保存为 mp4 格式的文件。你可以在终端中使用 Ctrl+C
终止捕获和保存。
@老虎会游泳,在 Linux 中,可以使用 v4l2-ctl
命令列出视频设备支持的模式。v4l2-ctl
是一个命令行工具,用于控制 Video4Linux2 视频设备。
以下是列出视频设备支持的模式的步骤:
打开终端。
运行以下命令,以列出支持的视频设备列表:
v4l2-ctl --list-devices
该命令会输出系统中所有可用的视频设备列表。
选择你要查询的视频设备,并运行以下命令,以列出支持的模式:
v4l2-ctl -d /dev/videoX --list-formats-ext
其中 /dev/videoX
是你要查询的视频设备路径。该命令会输出设备支持的所有格式及其详细信息,包括分辨率、帧率、像素格式等。
例如,以下是使用 v4l2-ctl
命令列出一个视频设备支持的模式的示例输出:
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Index : 1
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Index : 2
Type : Video Capture
Pixel Format: 'RGB3'
Name : RGB3
Index : 3
Type : Video Capture
Pixel Format: 'BGR3'
Name : BGR3
Index : 4
Type : Video Capture
Pixel Format: 'YU12'
Name : YU12
Index : 5
Type : Video Capture
Pixel Format: 'NV12'
Name : NV12
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Index : 6
Type : Video Capture
Pixel Format: 'NV21'
Name : NV21
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
Index : 7
Type : Video Capture
Pixel Format: 'GREY'
Name : Greyscale
Size: Discrete 1920x1080
Interval: Discrete 0.033s (30.000 fps)
该输出显示了一个名为 /dev/video0
的视频设备支持的所有格式及其详细信息。例如,该设备支持分辨率为 1920x1080、帧率为 30 fps 的 NV12 格式。
@老虎会游泳,以下是使用 gst-launch-1.0
命令从 /dev/video10
和 PulseAudio 默认麦克风捕获视频并保存为 mp4 文件的示例:
gst-launch-1.0 -v v4l2src device=/dev/video10 ! video/x-raw, width=640, height=480, framerate=30/1 ! tee name=t ! queue ! videoconvert ! x264enc ! mp4mux ! filesink location=output.mp4 t. ! queue ! audioconvert ! audioresample ! pulsesrc device=alsa_input.pci-0000_00_1b.0.analog-stereo ! audio/x-raw, rate=44100, channels=2 ! voaacenc ! mp4mux ! filesink location=output.mp4
该命令使用了以下元素:
v4l2src
:从 /dev/video10
设备中读取视频流。tee
:将视频流分成两个分支,一个用于视频编码,一个用于输出。queue
:队列元素用于平衡流水线中不同元素之间的速度差异。videoconvert
:将视频流从摄像头格式转换为编码器所需的格式。x264enc
:使用 H.264 编码器对视频进行编码。audioconvert
:将音频流从麦克风格式转换为编码器所需的格式。audioresample
:重新采样音频流以匹配编码器的要求。pulsesrc
:从 PulseAudio 默认麦克风中读取音频流。voaacenc
:使用 AAC 编码器对音频进行编码。mp4mux
:将视频和音频流组合为一个 MP4 文件。filesink
:将输出写入到 output.mp4
文件中。该命令捕获视频和音频,将它们编码为 H.264 和 AAC 格式,将它们混合在一起,并将它们保存到 output.mp4
文件中。你可以在终端中使用 Ctrl+C
终止捕获和保存。
@老虎会游泳,非常抱歉,我的之前的回答可能有误。在 gst-launch-1.0
命令中,确实存在一个链接错误。
以下是一个可以工作的示例命令,它使用 v4l2src
元素从 /dev/video10
捕获视频,使用 pulsesrc
元素从默认的 PulseAudio 麦克风捕获音频,并使用 tee
元素将音视频流分别送入编码和保存的管道中:
gst-launch-1.0 -e -v \
v4l2src device=/dev/video10 ! \
video/x-raw,width=640,height=480,framerate=30/1 ! \
tee name=t_vid ! \
queue ! videoconvert ! x264enc ! mp4mux ! filesink location=output.mp4 \
t_vid. ! queue ! videoconvert ! autovideosink sync=false \
pulsesrc device=alsa_input.pci-0000_00_1b.0.analog-stereo ! \
audio/x-raw,rate=44100,channels=2 ! \
tee name=t_aud ! \
queue ! audioconvert ! voaacenc ! mp4mux ! filesink location=output.mp4 \
t_aud. ! queue ! audioconvert ! autoaudiosink sync=false
这个命令具体使用了以下元素:
v4l2src
:从 /dev/video10
设备中读取视频流。video/x-raw, width=640, height=480, framerate=30/1
:指定视频流的格式和帧率。tee name=t_vid
:将视频流分成两个分支,一个用于编码,一个用于显示。queue
:在管道中添加一个队列元素,以便在多个元素之间平衡速度差异。videoconvert
:将视频流从摄像头格式转换为编码器所需的格式。x264enc
:使用 H.264 编码器对视频进行编码。mp4mux
:将视频和音频流组合为一个 MP4 文件。filesink
:将输出写入到 output.mp4
文件中。autovideosink
:自动选择合适的视频输出插件,实现视频显示。pulsesrc
:从 PulseAudio 默认麦克风中读取音频流。audio/x-raw, rate=44100, channels=2
:指定音频流的格式。tee name=t_aud
:将音频流分成两个分支,一个用于编码,一个用于输出。audioconvert
:将音频流从麦克风格式转换为编码器所需的格式。voaacenc
:使用 AAC 编码器对音频进行编码。autoaudiosink
:自动选择合适的音频输出插件,实现音频输出。这个命令会同时显示摄像头的视频并将其保存为 mp4 文件。当你按下 Ctrl+C
键时,命令会停止并退出。
# 安装依赖包
sudo apt install --no-install-recommends --no-install-suggests gstreamer1.0-plugins-bad
export GST_DEBUG=2
VIDEO_DEVICE="/dev/video0"
VIDEO_WIDTH="640"
VIDEO_HEIGHT="480"
VIDEO_FPS="30"
# 视频编码:h264 或 h265
VIDEO_CODEC="h264"
AUDIO_DEVICE="$(pactl get-default-source)"
AUDIO_SAMPLE_RATE="44100"
AUDIO_CHANNEL="2"
# 输出格式:matroska (mkv), mpegts 或 mp4
# 建议使用 matroska 或 mpegts,因为 mp4 未正常结束录制会无法观看
OUTPUT_FORMAT="matroska"
OUTPUT_FILE="./output.mkv"
echo "-------------------------------------"
echo "Video: $VIDEO_DEVICE (resolution: ${VIDEO_WIDTH}x${VIDEO_HEIGHT}, fps: $VIDEO_FPS, codec: $VIDEO_CODEC)"
echo "Audio: $AUDIO_DEVICE (sample rate: $AUDIO_SAMPLE_RATE, channel: $AUDIO_CHANNEL)"
echo "Output: $OUTPUT_FILE (format: $OUTPUT_FORMAT)"
echo "-------------------------------------"
gst-launch-1.0 -e \
v4l2src device="$VIDEO_DEVICE" \
! video/x-raw,width="$VIDEO_WIDTH",height="$VIDEO_HEIGHT",framerate="$VIDEO_FPS"/1 \
! tee name=preview \
! queue \
! videoconvert \
! mpp"$VIDEO_CODEC"enc \
! "$VIDEO_CODEC"parse \
! mx. \
preview. \
! queue \
! videoconvert \
! autovideosink sync=false \
pulsesrc device="$AUDIO_DEVICE" \
! audio/x-raw,rate="$AUDIO_SAMPLE_RATE",channels="$AUDIO_CHANNEL" \
! queue \
! audioconvert \
! voaacenc \
! mx. \
"$OUTPUT_FORMAT"mux name=mx \
! filesink location="$OUTPUT_FILE"
@老虎会游泳,你可以使用 pacmd
命令列出默认的 PulseAudio 输入设备名称。PulseAudio 是一种音频服务器,它可以让你在 Linux 系统中轻松管理音频输入和输出设备。
以下是列出默认的 PulseAudio 输入设备名称的步骤:
打开终端。
运行以下命令,以打开 PulseAudio 控制台:
pacmd
运行以下命令,以列出所有可用的 PulseAudio 输入设备及其属性:
list-sources
该命令会输出所有可用的输入设备列表,包括默认的输入设备。
在输出中查找名称为 alsa_input.XXX
的设备,其中 XXX
是设备的标识符。默认输入设备的名称通常是 alsa_input.XXX.analog-stereo
或类似的形式。
例如,以下是使用 pacmd
命令列出默认 PulseAudio 输入设备名称的示例输出:
1 source(s) available.
index: 0
name: <alsa_input.pci-0000_00_1b.0.analog-stereo>
driver: <module-alsa-card.c>
flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
state: SUSPENDED
suspend cause: IDLE
priority: 9049
volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB
balance 0.00
base volume: 65536 / 100% / 0.00 dB
volume steps: 65537
muted: no
current latency: 0.00 ms
max request: 344 KiB
max rewind: 344 KiB
monitor source: 0
sample spec: s16le 2ch 44100Hz
channel map: front-left,front-right
Stereo
used by: 0
linked by: 0
configured latency: 0.00 ms; range is 0.50 .. 371.52 ms
card: 0 <alsa_card.pci-0000_00_1b.0>
module: 6
properties:
alsa.resolution_bits = "16"
device.api = "alsa"
device.class = "sound"
alsa.class = "generic"
alsa.subclass = "generic-mix"
alsa.name = "STAC9200 Analog"
alsa.id = "STAC9200 Analog"
alsa.subdevice = "0"
alsa.subdevice_name = "subdevice #0"
alsa.device = "0"
alsa.card = "0"
alsa.card_name = "HDA Intel"
alsa.long_card_name = "HDA Intel at 0xf2000000 irq 45"
alsa.driver_name = "snd_hda_intel"
device.bus_path = "pci-0000:00:1b.0"
sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card0/input0"
device.bus = "pci"
device.vendor.id = "808
@ChatGPT,把这个gstreamer命令翻译成C++代码
# 安装依赖包
sudo apt install --no-install-recommends --no-install-suggests gstreamer1.0-plugins-bad
export GST_DEBUG=2
VIDEO_DEVICE="/dev/video0"
VIDEO_WIDTH="640"
VIDEO_HEIGHT="480"
VIDEO_FPS="30"
# 视频编码:h264 或 h265
VIDEO_CODEC="h264"
AUDIO_DEVICE="$(pactl get-default-source)"
AUDIO_SAMPLE_RATE="44100"
AUDIO_CHANNEL="2"
# 输出格式:matroska (mkv), mpegts 或 mp4
# 建议使用 matroska 或 mpegts,因为 mp4 未正常结束录制会无法观看
OUTPUT_FORMAT="matroska"
OUTPUT_FILE="./output.mkv"
echo "-------------------------------------"
echo "Video: $VIDEO_DEVICE (resolution: ${VIDEO_WIDTH}x${VIDEO_HEIGHT}, fps: $VIDEO_FPS, codec: $VIDEO_CODEC)"
echo "Audio: $AUDIO_DEVICE (sample rate: $AUDIO_SAMPLE_RATE, channel: $AUDIO_CHANNEL)"
echo "Output: $OUTPUT_FILE (format: $OUTPUT_FORMAT)"
echo "-------------------------------------"
gst-launch-1.0 -e \
v4l2src device="$VIDEO_DEVICE" \
! video/x-raw,width="$VIDEO_WIDTH",height="$VIDEO_HEIGHT",framerate="$VIDEO_FPS"/1 \
! tee name=preview \
! queue \
! videoconvert \
! mpp"$VIDEO_CODEC"enc \
! "$VIDEO_CODEC"parse \
! mx. \
preview. \
! queue \
! videoconvert \
! autovideosink sync=false \
pulsesrc device="$AUDIO_DEVICE" \
! audio/x-raw,rate="$AUDIO_SAMPLE_RATE",channels="$AUDIO_CHANNEL" \
! queue \
! audioconvert \
! voaacenc \
! mx. \
"$OUTPUT_FORMAT"mux name=mx \
! filesink location="$OUTPUT_FILE"
@老虎会游泳,以下是将给定的GStreamer命令翻译为C++代码的实现示例。需要使用GStreamer C++库来实现以下代码:
#include <gst/gst.h>
int main(int argc, char *argv[]) {
GstElement *pipeline, *v4l2src, *tee, *preview_queue, *preview_videoconvert, *mpp_video_encoder,
*video_parser, *preview_videosink, *pulsesrc, *audio_queue, *audioconvert, *voaacenc,
*audio_mixer, *muxer, *file_sink;
GstCaps *video_caps, *audio_caps;
GstBus *bus;
GstMessage *msg;
GMainLoop *loop;
// Initialize GStreamer
gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
// Create elements
pipeline = gst_pipeline_new("video-audio-record-pipeline");
v4l2src = gst_element_factory_make("v4l2src", "video-source");
tee = gst_element_factory_make("tee", "preview-and-encode-tee");
preview_queue = gst_element_factory_make("queue", "preview-queue");
preview_videoconvert = gst_element_factory_make("videoconvert", "preview-videoconvert");
mpp_video_encoder = gst_element_factory_make("mpph264enc", "video-encoder");
video_parser = gst_element_factory_make("h264parse", "video-parser");
preview_videosink = gst_element_factory_make("autovideosink", "preview-videosink");
pulsesrc = gst_element_factory_make("pulsesrc", "audio-source");
audio_queue = gst_element_factory_make("queue", "audio-queue");
audioconvert = gst_element_factory_make("audioconvert", "audio-convert");
voaacenc = gst_element_factory_make("voaacenc", "audio-encoder");
audio_mixer = gst_element_factory_make("audiomixer", "audio-mixer");
muxer = gst_element_factory_make("matroskamux", "muxer");
file_sink = gst_element_factory_make("filesink", "file-sink");
// Set element properties
g_object_set(G_OBJECT(v4l2src), "device", "/dev/video0", NULL);
g_object_set(G_OBJECT(mpp_video_encoder), "bitrate", 8000000, NULL);
g_object_set(G_OBJECT(v4l2src), "num-buffers", 1000, NULL);
g_object_set(G_OBJECT(pulsesrc), "device", "alsa_input.pci-0000_00_1f.3.analog-stereo", NULL);
g_object_set(G_OBJECT(voaacenc), "bitrate", 128000, NULL);
g_object_set(G_OBJECT(muxer), "streamable", TRUE, NULL);
g_object_set(G_OBJECT(file_sink), "location", "./output.mkv", NULL);
// Create caps
video_caps = gst_caps_new_simple("video/x-raw",
"width", G_TYPE_INT, 640,
"height", G_TYPE_INT, 480,
"framerate", GST_TYPE_FRACTION, 30, 1,
NULL);
audio_caps = gst_caps_new_simple("audio/x-raw",
"rate", G_TYPE_INT, 44100,
"channels", G_TYPE_INT, 2,
NULL);
// Add elements to pipeline
gst_bin_add_many(GST_BIN(pipeline), v4l2src, tee, preview_queue, preview_videoconvert,
mpp_video_encoder
, video_parser, preview_videosink, pulsesrc, audio_queue, audioconvert, voaacenc,
audio_mixer, muxer, file_sink, NULL);
// Link elements
gst_element_link_many(v4l2src, tee, NULL);
gst_element_link_many(preview_queue, preview_videoconvert, preview_videosink, NULL);
gst_element_link_many(pulsesrc, audio_queue, audioconvert, voaacenc, audio_mixer, NULL);
gst_element_link_many(mpp_video_encoder, video_parser, muxer, NULL);
gst_element_link_many(audio_mixer, muxer, NULL);
gst_element_link_many(muxer, file_sink, NULL);
// Link preview branch
GstPadTemplate *tee_src_pad_template;
GstPad *tee_preview_pad, *preview_videoconvert_sink_pad;
tee_src_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS(tee), "src_%u");
tee_preview_pad = gst_element_request_pad(tee, tee_src_pad_template, NULL, NULL);
preview_videoconvert_sink_pad = gst_element_get_static_pad(preview_videoconvert, "sink");
gst_element_link(tee_preview_pad, preview_queue);
gst_element_link(preview_queue, preview_videoconvert);
gst_element_link(preview_videoconvert, preview_videosink);
gst_object_unref(preview_videoconvert_sink_pad);
// Link audio branch
GstPad *tee_audio_pad, *audio_mixer_sink_pad;
tee_audio_pad = gst_element_request_pad(tee, tee_src_pad_template, NULL, NULL);
audio_mixer_sink_pad = gst_element_get_static_pad(audio_mixer, "sink_0");
gst_element_link(tee_audio_pad, pulsesrc);
gst_element_link(pulsesrc, audio_queue);
gst_element_link(audio_queue, audioconvert);
gst_element_link(audioconvert, voaacenc);
gst_element_link(voaacenc, audio_mixer);
gst_element_link(audio_mixer, muxer);
gst_object_unref(audio_mixer_sink_pad);
// Start pipeline
gst_element_set_state(pipeline, GST_STATE_PLAYING);
// Wait until error or EOS
bus = gst_element_get_bus(pipeline);
msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS));
if (msg != NULL) {
gst_message_unref(msg);
}
gst_object_unref(bus);
// Stop pipeline
gst_element_set_state(pipeline, GST_STATE_NULL);
// Free resources
gst_object_unref(GST_OBJECT(pipeline));
gst_caps_unref(video_caps);
gst_caps_unref(audio_caps);
g_main_loop_unref(loop);
return 0;
}
上述代码基于GStreamer C++库,使用C++编写了与给定的GStreamer命令相同的功能,可以实现视频和音频的录制和编码,并将其保存到Matroska格式的输出文件中。