multivideo_transcode 示例程序演示了如何并行转码多个视频流。
该应用程序从码流文件读取输入缓冲区,执行解码,并生成 YUV 文件,然后将 YUV 文件传递给编码器以将其编码回所需的编解码器格式。它可以为多个输入流执行转码并生成多个输出,每个输出彼此独立。
该应用程序在文件源模拟输入缓冲区上运行,因此不需要摄像头。
支持的视频格式包括
$ 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
下图显示了此示例的流程。

该示例使用以下主要结构和类。
| 元素 | 描述 |
|---|---|
| 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_plane 和 capture_plane。这些对象都派生自 NvV4l2ElementPlane 类类型。示例使用以下主要成员
| 元素 | 描述 |
|---|---|
| setupPlane | 设置 V4L2 元素的平面。 |
| deinitPlane | 销毁 V4L2 元素的平面。 |
| setStreamStatus | 启动/停止流。 |
| setDQThreadCallback | 设置出队缓冲区线程的回调函数。 |
| startDQThread | 启动出队缓冲区线程。 |
| stopDQThread | 停止出队缓冲区线程。 |
| qBuffer | 将 V4L2 缓冲区入队。 |
| dqBuffer | 将 V4L2 缓冲区出队。 |
| getNumBuffers | 获取 V4L2 缓冲区的数量。 |
| getNumQueuedBuffers | 获取当前在平面上排队的缓冲区数量。 |