Skip to content

Latest commit

 

History

History
148 lines (102 loc) · 3.66 KB

record.md

File metadata and controls

148 lines (102 loc) · 3.66 KB
title update
MaixCAM MaixPy 录像
date author version content
2024-05-20
lxowalle
1.0.0
初版文档

简介

本文档提供录像功能的使用方法

示例一

一个录入h265格式视频的示例

from maix import video, image, camera, app, time

cam = camera.Camera(640, 480, image.Format.FMT_YVU420SP)
e = video.Encoder()
f = open('/root/output.h265', 'wb')

record_ms = 2000
start_ms = time.ticks_ms()
while not app.need_exit():
    img = cam.read()
    frame = e.encode(img)
    
    print(frame.size())
    f.write(frame.to_bytes())

    if time.ticks_ms() - start_ms > record_ms:
        app.set_exit_flag(True)

步骤:

  1. 导入模块并初始化摄像头

    from maix import video, image, camera, app, time
    cam = camera.Camera(640, 480, image.Format.FMT_YVU420SP)
    • camera.Camera()用来初始化摄像头, 这里初始化摄像头分辨率为640x480,注意目前Encoder只支持NV21格式,因此设置图像格式为image.Format.FMT_YVU420SP
  2. 初始化Encoder模块

    e = video.Encoder()
    • video.Encoder()模块目前只支持处理image.Format.FMT_YVU420SP格式图像,支持h265h264编码, 默认为h265编码。如果你想使用h264编码,则可以修改初始化参数为 video.Encoder(type=video.VideoType.VIDEO_H264_CBR)
    • 注意,同时只能存在一个编码器
  3. 编码摄像头的图像

    img = cam.read()
    frame = e.encode(img)
    • img = cam.read()读取摄像头图像并保存到img
    • frame = e.encode(img)img编码并保存结果到frame
  4. 保存编码结果到文件

    f = open('/root/output.h265', 'wb')
    f.write(frame.to_bytes(False))
    • f = open(xxx)打开并创建一个文件
    • f.write(frame.to_bytes(False))将编码结果frame转换为bytes类型,然后调用f.write()将数据写入文件中
  5. 定时2s退出

    record_ms = 2000
    start_ms = time.ticks_ms()
    while not app.need_exit():
        if time.ticks_ms() - start_ms > record_ms:
        app.set_exit_flag(True)
    • 这里是定时退出的应用逻辑,自己看看吧
  6. 完成

示例二

一个录入h265格式视频的示例

from maix import video, time, image, camera, app

cam = camera.Camera(640, 480, image.Format.FMT_YVU420SP)
e = video.Encoder(capture = True)
e.bind_camera(cam)

f = open('/root/output.h265', 'wb')

record_ms = 2000
start_ms = time.ticks_ms()
while not app.need_exit():
    frame = e.encode()
    img = e.capture()

    print(frame.size())
    f.write(frame.to_bytes(True))

    if time.ticks_ms() - start_ms > record_ms:
        app.set_exit_flag(True)

与示例一类似,区别在于调用了Encoder对象的bind_camera方法,Encoder主动取图,这样的优点是可以充分利用硬件特性,增加编码速率

e = video.Encoder(capture = True)
e.bind_camera(cam)
frame = e.encode()
img = e.capture()
  • e = video.Encoder(capture = True)使能了capture参数,让编码时可以抓取编码的图像
  • e.bind_camera(cam)将摄像头绑定到Encoder对象
  • frame = e.encode()编码时不需要再传入img,而是内部从摄像头取图
  • img = e.capture()Encoder对象中抓取编码的图像

转换为MP4格式

如果想要录制mp4格式视频,可以先录制好H265视频,再使用系统内的ffmpeg工具转换为mp4格式

import os

# Pack h265 to mp4
# /root/output.h265 是h265文件路径
# /root/output.mp4  是mp4文件路径
os.system('ffmpeg -loglevel quiet -i /root/output.h265 -c:v copy -c:a copy /root/output.mp4 -y')