【备份】ROC-RK3588S-PC开发板资料

回复列表(63|隐藏机器人聊天)
  • @Ta / 2022-10-05 / /

    @老虎会游泳,usb口啊
    你的那个应该是用type-C口吧
    一加8Pro

  • @Ta / 2022-10-05 / /

    需要一个双usb口的线来刷
    一加8Pro

  • @Ta / 2022-10-05 / /

    @罐子,嗯我的是type-c。

  • @Ta / 2023-04-07 / /

    @ChatGPT,写一个ffmpeg命令,从/dev/video10和pulseaudio默认麦克风捕捉视频,并保存为mp4文件

  • @Ta / 2023-04-07 / /

    @老虎会游泳,以下是一个使用 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 终止捕获和保存。

  • @Ta / 2023-04-07 / /

    @ChatGPT,列出视频设备支持的模式

  • @Ta / 2023-04-07 / /

    @老虎会游泳,在 Linux 中,可以使用 v4l2-ctl 命令列出视频设备支持的模式。v4l2-ctl 是一个命令行工具,用于控制 Video4Linux2 视频设备。

    以下是列出视频设备支持的模式的步骤:

    1. 打开终端。

    2. 运行以下命令,以列出支持的视频设备列表:

      v4l2-ctl --list-devices
      

      该命令会输出系统中所有可用的视频设备列表。

    3. 选择你要查询的视频设备,并运行以下命令,以列出支持的模式:

      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 格式。

  • @Ta / 2023-04-07 / /

    @ChatGPT,写一个gst-launch-1.0命令,从/dev/video10和pulseaudio默认麦克风捕捉视频,并保存为mp4文件

  • @Ta / 2023-04-07 / /

    @老虎会游泳,ChatGPT接口报错(网络错误),请重试。

    可发送“@ChatGPT,重试”来快速重试。

    您也可以尝试@其他机器人,当前在线的机器人有:

  • @Ta / 2023-04-07 / /

    @ChatGPT,重试

  • @Ta / 2023-04-07 / /

    @老虎会游泳,以下是使用 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 终止捕获和保存。

  • @Ta / 2023-04-07 / /

    @ChatGPT,你给的命令不能运行:
    错误管道: 无法将 queue1 链接到 audioconvert0

  • @Ta / 2023-04-07 / /

    @老虎会游泳,非常抱歉,我的之前的回答可能有误。在 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 键时,命令会停止并退出。

  • @Ta / 2023-05-08 / /

    gstreamer通过摄像头录像,通过麦克风录音,使用RKMPP硬件加速视频编码,同时打开一个预览窗口

    # 安装依赖包
    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"
    
  • @Ta / 2023-04-07 / /

    @ChatGPT,列出默认pulseaudio source device name

  • @Ta / 2023-04-07 / /

    @老虎会游泳,你可以使用 pacmd 命令列出默认的 PulseAudio 输入设备名称。PulseAudio 是一种音频服务器,它可以让你在 Linux 系统中轻松管理音频输入和输出设备。

    以下是列出默认的 PulseAudio 输入设备名称的步骤:

    1. 打开终端。

    2. 运行以下命令,以打开 PulseAudio 控制台:

      pacmd
      
    3. 运行以下命令,以列出所有可用的 PulseAudio 输入设备及其属性:

      list-sources
      

      该命令会输出所有可用的输入设备列表,包括默认的输入设备。

    4. 在输出中查找名称为 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
    
  • @Ta / 2023-05-08 / /

    @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"
    
  • @Ta / 2023-05-08 / /

    @老虎会游泳,以下是将给定的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
    
  • @Ta / 2023-05-08 / /

    @ChatGPT,继续

  • @Ta / 2023-05-08 / /

    @老虎会游泳

                     , 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格式的输出文件中。

添加新回复
回复需要登录