本示例演示了如何:
本示例不需要摄像头。
$ cd /usr/src/jetson_multimedia_api/samples/05_jpeg_encode $ make
$ ./jpeg_encode <in-file> <in-width> <in-height> <out-file> [OPTIONS]
$ ./jpeg_encode ../../data/Picture/nvidia-logo.yuv 1920 1080 test.jpg
jpeg_encode 示例使用 YUV 文件。如果您还没有 YUV 文件,可以使用 jpeg_decode 示例生成一个。例如:$ cd /usr/src/jetson_multimedia_api/samples/06_jpeg_decode/ $ ./jpeg_decode num_files 1 ../../data/Picture/nvidia-logo.jpg ../../data/Picture/nvidia-logo.yuv
下图显示了数据流经本示例的流程。

输出平面用于接收输入,捕获平面用于生成输出。进入 JPEG 编码器之前的 YUV 数据格式可以是块状、线性或倾斜线性。 这导致 2 种不同的编码过程:encodeFromFD 和 encodeFromBuffer。 encodeFromFD 允许 JPEG 编码硬件直接处理数据。 encodeFromBuffer 需要在写入 JPEG 文件之前进行额外的格式转换。
struct context_t 全局结构管理应用程序中的所有资源。
| NvVideoDecoder | 描述 |
|---|---|
| 类 NvVideoConverter | 包含关于视频格式转换的元素和函数。 |
| 类 NvJpegEncoder | 包含用于编码 JPEG 图像的元素和函数。 |
NvVideoConverter 包含所有视频转换相关的元素和函数。示例中使用的 NvVideoConverter 的主要成员包括:
| NvVideoConverter 成员 | 描述 |
|---|---|
| output_plane | V4l2 输出平面。 |
| capture_plane | V4l2 捕获平面。 |
| waitForIdle | 等待直到所有排队的输出平面缓冲区都被处理并从捕获平面出队。 |
| setOutputPlaneFormat | 设置输出平面格式。 |
| setCapturePlaneFormat | 设置捕获平面格式。 |
NvVideoConverter 元素 output_plane 和 capture_plane 属于 NvV4l2ElementPlane 类。示例中使用的 NvV4l2ElementPlane 的主要成员如下:
| 元素 | 描述 |
|---|---|
| setupPlane | 设置 V4l2 元素的平面。 |
| deinitPlane | 销毁 V4l2 元素的平面。 |
| setStreamStatus | 启动/停止流。 |
| setDQThreadCallback | 设置出队缓冲区线程的回调函数。 |
| startDQThread | 启动出队缓冲区线程。 |
| stopDQThread | 停止出队缓冲区线程。 |
| qBuffer | 将 V4l2 缓冲区入队。 |
| dqBuffer | 将 V4l2 缓冲区出队。 |
| getNumBuffers | 获取 V4l2 缓冲区的数量。 |
| getNumQueuedBuffers | 获取队列中 V4l2 缓冲区的数量。 |
| getNthBuffer | 获取索引为 N 的 NvBuffer。 |
NvJpegEncoder 类包含所有用于 JPEG 编码的函数。使用的主要成员包括:
| NvV4l2ElementPlane | 描述 |
|---|---|
| encodeFromFd | 从 V4L2 元素导出的缓冲区的 FD 进行编码。 |
| encodeFromBuffer | 从缓冲区数据的指针进行编码。 |