multivideo_encode 示例应用程序演示了如何并行编码多个视频流。
该应用程序从 YUV 文件读取输入缓冲区,执行 H.264、H.265、VP8 或 VP9 视频编码,并将编码后的码流保存到基本文件。它可以为多个输入和相应的输出并行执行此操作。
该应用程序在文件源模拟输入缓冲区上运行,因此不需要摄像头。
支持的视频格式有
$ cd /usr/src/jetson_multimedia_api/samples/15_multivideo_encode $ make
$ multivideo_encode num_files <number_of_files> <in-file1> <in-width1> <in-height1> <encoder-type1> <out-file1> <in-file2> <in-width2> <in-height2> <encoder-type2> <out-file2> [OPTIONS]
输入
$ ./multivideo_encode --help
$ ./multivideo_encode num_files 2 ../../data/Video/sample_outdoor_car_1080p_10fps.yuv 1920 1080 H264 sample_outdoor_car_1080p_10fps.h264 ../../data/Video/sample_outdoor_car_1080p_10fps.yuv 1920 1080 H264 sample_outdoor_car_1080p_10fps_second.h264
下图显示了通过此示例的流程。
对于输出平面,应用程序支持 MMAP、DMABUF 和 USRPTR 内存类型。 对于捕获平面,它支持 MMAP 内存类型。
该示例使用以下关键结构和类。
元素 | 描述 |
---|---|
NvVideoEncoder | 包含所有视频编码相关的元素和函数。 |
Enc_pollthread | 指向编码捕获循环的线程处理程序的指针。 |
NvVideoEncoder 类封装了所有视频编码相关的元素和函数。示例中使用的关键成员是
成员 | 描述 |
---|---|
output_plane | 指定 V4L2 输出平面。 |
capture_plane | 指定 V4L2 捕获平面。 |
createVideoEncoder | 用于创建视频编码对象的静态函数。 |
subscribeEvent | 订阅事件。 |
setOutputPlaneFormat | 设置输出平面格式。 |
setCapturePlaneFormat | 设置捕获平面格式。 |
dqEvent | 从 V4L2 设备报告的事件中出队事件。 |
isInError | 检查是否处于错误状态。 |
NvVideoEncoder 类包含两个关键元素:output_plane
和 capture_plane
。 这些对象派生自 NvV4l2ElementPlane 类类型。 该示例使用以下关键成员
元素 | 描述 |
---|---|
setupPlane | 设置 V4L2 元素的平面。 |
deinitPlane | 销毁 V4L2 元素的平面。 |
setStreamStatus | 启动/停止流。 |
setDQThreadCallback | 设置出队缓冲区线程的回调函数。 |
startDQThread | 启动出队缓冲区线程。 |
stopDQThread | 停止出队缓冲区线程。 |
qBuffer | 将 V4L2 缓冲区入队。 |
dqBuffer | 将 V4L2 缓冲区出队。 |
getNumBuffers | 获取 V4L2 缓冲区的数量。 |
getNumQueuedBuffers | 获取当前在平面上排队的缓冲区数量。 |