Jetson Linux API 参考文档

32.7.4 版本
03_video_cuda_enc (使用 CUDA 进行处理和编码)

概述

Video CUDA 编码器示例演示了如何使用 libv4l2 API 捕获和编码 H.264/H.265 视频流。在开始编码之前,它使用 NVIDIA® CUDA® API 在输入的 YUV 图像数据上渲染一个黑色矩形;解码组件使用和共享相同的缓冲区。


构建和运行

前提条件

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

构建

  • 输入
     $ cd /usr/src/jetson_multimedia_api/samples/03_video_cuda_enc
     $ make
    

运行

  • 输入
     $ ./video_cuda_enc <in-file> <in-width> <in-height> <encoder-type> <out-file> [OPTIONS]
    

示例

   $ ./video_cuda_enc ../../data/Video/sample_outdoor_car_1080p_10fps.yuv 1920 1080 H264 test.h264
注意
video_cuda_enc 示例使用 YUV 文件。如果您还没有 YUV 文件,可以使用 video_dec_cuda 示例生成一个。例如
 $ cd /usr/src/jetson_multimedia_api/samples/02_video_dec_cuda/
 $ ./video_dec_cuda ../../data/Video/sample_outdoor_car_1080p_10fps.h264 H264 --disable-rendering \
   -o ../../data/Video/sample_outdoor_car_1080p_10fps.yuv -f 2


流程

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

NV 定义的 NvEGLImageFromFd API 从 Tegra 分配的文件描述符缓冲区返回一个 EGLImage 指针。然后 CUDA 使用 EGLImage 缓冲区来渲染矩形。然后,该缓冲区执行视频编码操作,并将其编码为 H.264 或 H.265 视频流。


主要结构和类

struct context_t 全局结构体管理应用程序中的所有资源。

NvVideoConverter描述
class NvVideoEncoder此类包含所有视频编码相关的元素和函数。
EGLImageHKR指定用于 CUDA 处理的 EGLImage。

NvVideoConverter 类封装了所有视频转换相关的元素和函数。该示例使用以下主要成员:

NvVideoConverter描述
output_plane (输出平面) 指定输出平面。
capture_plane (捕获平面) 指定捕获平面。
createVideoEncoder (创建视频编码器) 用于创建视频编码对象的静态函数。
setExtControls (设置外部控件) 设置 V4l2 设备的外部控件。
setOutputPlaneFormat (设置输出平面格式) 设置输出平面格式。
[setCapturePlaneFormat](NvVideoConverter::setCapturePlaneFormat) (设置捕获平面格式)设置捕获平面格式。
isInError (检查错误状态) 检查是否处于错误状态。

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

NvV4l2ElementPlane描述
setupPlane (设置平面) 设置 V4l2 元素的平面。
deinitPlane (取消初始化平面) 销毁 V4l2 元素的平面。
setStreamStatus (设置流状态) 启动/停止流。
setDQThreadCallback (设置出队缓冲区线程回调函数) 设置出队缓冲区线程的回调函数。
startDQThread (启动出队缓冲区线程) 启动出队缓冲区线程。
stopDQThread (停止出队缓冲区线程) 停止出队缓冲区线程。
qBuffer (入队缓冲区) 将 V4l2 缓冲区入队。
dqBuffer (出队缓冲区) 将 V4l2 缓冲区出队。
getNumBuffers (获取缓冲区数量) 获取 V4l2 缓冲区的数量。
getNthBuffer (获取第 N 个缓冲区) 获取第 N 个 V4l2 缓冲区。

两个全局函数用于从 dmabuf 文件描述符创建和销毁 EGLImage。

全局函数描述
NvEGLImageFromFd (从 dmabuf fd 创建 EGLImage)从 dmabuf fd 创建 EGLImage。
NvDestroyEGLImage (销毁 EGLImage)销毁 EGLImage。
. All rights reserved.