人若无名 便可潜心练剑.|

hazy1k

园龄:7个月粉丝:14关注:0

第23章 录放视频

第二十三章 录放视频

我们先录制,再播放视频。在录制视频时会同步录制音频(用板载的贴片麦克风),大家在播放视频时把耳机连接到3.5mm耳机接口就可以听到当前录制的声音了。

1. 录制视频

from media.mp4format import *
import os

width = 800
height = 480

file_name = "/data/test.mp4"

MAX_RECORD_TIME = 30 # 设置默认录制时间(单位:秒)

def mp4_muxer_test():
    print("mp4_muxer_test start")

    mp4_muxer = Mp4Container() # 实例化mp4 container
    mp4_cfg = Mp4CfgStr(mp4_muxer.MP4_CONFIG_TYPE_MUXER)
    if mp4_cfg.type == mp4_muxer.MP4_CONFIG_TYPE_MUXER:
        mp4_cfg.SetMuxerCfg(file_name, mp4_muxer.MP4_CODEC_ID_H265, width, height, mp4_muxer.MP4_CODEC_ID_G711U)
    mp4_muxer.Create(mp4_cfg) # 创建mp4 muxer
    mp4_muxer.Start() # 启动mp4 muxer
    start_time_ms = time.ticks_ms()  # 记录开始时间
    elapsed_time = 0
    frame_count = 0

    try:
        while True:
            os.exitpoint()
            # 处理音视频数据,按MP4格式写入文件
            mp4_muxer.Process()
            frame_count += 1
            print("frame_count = ", frame_count)
            # 检查当前时间与开始时间的差值是否超过最大录制时间
            elapsed_time = time.ticks_ms() - start_time_ms
            if elapsed_time >= MAX_RECORD_TIME*1000:
                print("录制已超过最大时长,停止录制,请等待视频保存")
                break

    except BaseException as e:
        print(e)
    # 停止mp4 muxer
    mp4_muxer.Stop()
    # 销毁mp4 muxer
    mp4_muxer.Destroy()
    print("mp4_muxer_test stop,video saved!")

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    mp4_muxer_test()
    

修改widthheight可以改变录制视频的宽度和高度,file_name可以改变存储路径(如果你要保存的文件夹没有被创建,记得要先创建,这里的data目录是和sdcard目录同级的),修改MAX_RECORD_TIME可以改变录制视频的长度,默认是录制30s的视频。

接下来,通过mp4_muxer_test这个自定义函数来进行视频的录制。函数中首先创建了一个Mp4Container对象,用来处理视频文件的生成和格式化。然后,配置视频的编码格式和参数,并启动视频录制。

录制过程通过一个while循环持续进行,每次循环都会处理音视频数据并将其写入MP4文件。在循环中,通过time.ticks_ms()获取当前时间,并与开始录制时的时间进行比较。当录制时间超过设定的最大时长(30秒)时,程序会输出提示信息并跳出循环,停止录制。

最后,录制停止后,调用mp4_muxer.Stop()mp4_muxer.Destroy()来停止并销毁视频处理对象,表示录制已结束,视频文件已保存。这一段的时间可能会比较长,大家一定要看到串行终端打印出mp4_muxer_test stop,video saved!后再停止程序运行及断电。

2. 播放视频

from media.player import * 
import os

start_play = False # 播放结束flag


def player_event(event, data):
    global start_play
    if event == K_PLAYER_EVENT_EOF: # 播放结束标识
        start_play = False # 设置播放结束标识


def play_mp4_test(filename):
    global start_play
    player=Player() # 创建播放器对象
    player.load(filename) # 加载mp4文件
    player.set_event_callback(player_event) # 设置播放器事件回调
    player.start() # 开始播放
    start_play = True

    # 等待播放结束
    try:
        while start_play:
            time.sleep(0.1)
            os.exitpoint()
    except KeyboardInterrupt as e:
        print("user stop: ", e)
    except BaseException as e:
        sys.print_exception(e)

    player.stop() # 停止播放
    print("play over")

if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    play_mp4_test("/data/test.mp4") # 播放mp4文件
    

将上面的程序复制到IDE中,就能在帧缓冲区中看到正常播放的视频了。

本文作者:hazy1k

本文链接:https://www.cnblogs.com/hazy1k/p/18739222

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hazy1k  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起