Jetson Linux API 参考文档

32.7.4 版本
16_multivideo_encode (多视频转码)

概述

multivideo_transcode 示例程序演示了如何并行转码多个视频流。

该应用程序从码流文件读取输入缓冲区,执行解码,并生成 YUV 文件,然后将 YUV 文件传递给编码器以将其编码回所需的编解码器格式。它可以为多个输入流执行转码并生成多个输出,每个输出彼此独立。

该应用程序在文件源模拟输入缓冲区上运行,因此不需要摄像头。

支持的视频格式包括

  • H.264
  • H.265
  • VP8
  • VP9

构建和运行

前提条件

  • 您已按照构建和运行中的步骤 1-3 进行操作。
  • 如果您是从主机 Linux PC (x86) 构建,则您已按照构建和运行中的步骤 4 进行操作。

构建

  • 输入
     $ cd /usr/src/jetson_multimedia_api/samples/16_multivideo_transcode
     $ make
    

运行

  • 输入
    $ ./multivideo_transcode num_files <number_of_files> <in-file1> <in-pixfmt1> <out-file1> <out-pixfmt1> <in-file2> <in-pixfmt2> <out-file2> <out-pixfmt2> ... [OPTIONS]
    

查看支持的选项

输入

   $ ./multivideo_transcode --help

示例

   $ ./multivideo_transcode num_files 2 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 sample_outdoor_car_1080p_10fps.h265 H265 ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 sample_outdoor_car_1080p_10fps_second.vp9 VP9

流程

下图显示了此示例的流程。

  1. 解码器的输出平面接收码流格式的输入,并将其传递给解码器进行解码。
  2. 解码器的捕获平面将解码后的 YUV 帧传输到编码器的输出平面进行编码。
  3. 编码器的捕获平面以码流格式将编码后的帧传输到应用程序。
  4. 编码后的码流被写入文件。
  5. 对于解码器,应用程序在输出平面支持 MMAP,在捕获平面支持 DMABUF。
  6. 对于编码器,应用程序在输出平面支持 DMABUF,在捕获平面支持 MMAP。

主要结构和类

该示例使用以下主要结构和类。

元素描述
NvVideoEncoder 包含所有视频编码相关元素和函数。
NvVideoDecoder 包含所有视频解码相关元素和函数。
encoder_capture_plane_dq_callback指向编码捕获循环的线程处理程序的指针。
dec_capture_loop指向解码捕获循环以及编码输出循环的线程处理程序的指针。

NvVideoEncoder 类和 NvVideoDecoder 类打包了所有视频编码和解码相关元素和函数。示例中使用的主要成员是

成员描述
output_plane 指定 V4L2 输出平面。
capture_plane 指定 V4L2 捕获平面。
createVideoDecoder 创建视频解码对象的静态函数。
createVideoEncoder 创建视频编码对象的静态函数。
subscribeEvent 订阅事件。
setOutputPlaneFormat 设置输出平面格式。
setCapturePlaneFormat 设置捕获平面格式。
dqEvent 将 V4L2 设备报告的事件出队。
isInError 检查是否处于错误状态。

类 NvVideoEncoder 和 NvVideoDecoder 各自包含两个关键元素:output_planecapture_plane。这些对象都派生自 NvV4l2ElementPlane 类类型。示例使用以下主要成员

元素描述
setupPlane 设置 V4L2 元素的平面。
deinitPlane 销毁 V4L2 元素的平面。
setStreamStatus 启动/停止流。
setDQThreadCallback 设置出队缓冲区线程的回调函数。
startDQThread 启动出队缓冲区线程。
stopDQThread 停止出队缓冲区线程。
qBuffer 将 V4L2 缓冲区入队。
dqBuffer 将 V4L2 缓冲区出队。
getNumBuffers 获取 V4L2 缓冲区的数量。
getNumQueuedBuffers 获取当前在平面上排队的缓冲区数量。
. All rights reserved.