02-Media-9-video_encoder.py 使用视频编码器(VENC)来捕获并编码视频,保存在TF卡中的示例程序
video_encoder.py 使用视频编码器(VENC)来捕获并编码视频,保存在TF卡中的示例程序。可以通过调用这些 API 进行视频编码,生成不同分辨率和编码格式的码流。VENC 模块需与相机模块结合使用以实现编码功能。
程序包含两个主要函数:vi_bind_venc_test 和 stream_venc_test
vi_bind_venc_test
通过直接绑定摄像头和视频编码器(VENC)来捕获并编码视频。
步骤:
-
根据文件后缀名确定编码格式(H.264或H.265)。
-
初始化摄像头传感器,设置输出图像的大小和格式(YUV420SP)。
-
实例化编码器,并设置输出缓冲区。
-
使用MediaManager将摄像头的输出直接绑定到编码器的输入。
-
初始化MediaManager。
-
根据编码格式设置编码器通道属性。
-
创建编码器并启动。
-
启动摄像头。
-
循环获取编码后的数据流并写入文件,直到达到200帧,为了方便演示,这里调整成了1000。
-
清理资源:停止摄像头、解除绑定、停止编码器、销毁编码器、释放MediaManager资源。
stream_venc_test
通过手动获取摄像头帧并发送到编码器进行编码。
步骤:
-
与vi_bind_venc_test类似,设置编码格式、初始化传感器和编码器。
-
但是,这里没有直接绑定,而是手动从摄像头获取每一帧(通过sensor.snapshot),然后构造帧信息(frame_info)并发送给编码器(SendFrame)。
-
然后获取编码后的流并写入文件。
-
注意:在手动发送帧的模式下,需要计算YUV420SP格式的UV平面的物理地址,这里根据不同的分辨率进行了不同的偏移计算。
注意:
-
程序需要SD卡来存储编码后的文件。
-
两个函数的主要区别在于数据流的传递方式:一个是直接绑定,另一个是手动获取和发送帧。
-
直接绑定方式效率更高,因为不需要Python代码介入每一帧的传递;而手动方式则更灵活,可以在发送前对帧进行处理。
主函数
if __name__ == "__main__":
os.exitpoint(os.EXITPOINT_ENABLE)
#vi_bind_venc_test("/data/examples/test.264",800,480) # vi绑定venc示例
#vi_bind_venc_test("/data/examples/test.265",800,480) # vi绑定venc示例
#stream_venc_test("/data/examples/test.264",800,480) # venc编码数据流示例
stream_venc_test("/data/examples/test.265",800,480) # venc编码数据流示例
为了演示程序功能,分别将 vi