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