MaixPy3 播放视频

更新时间 负责人 内容 备注
2021年12月4日 Rui 初次编写文档 ----
2022年1月18日 dalaoshu 修改文档,增加效果图 ----
2022年4月24日 Coty 修改视频播放代码,修改了提供视频的尺寸 ----

实际上它是由 ffmpeg + pyav 编译而来,它们分别是什么呢?

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

https://pyav.org/docs/develop/

PyAV 是一个用于 FFmpeg 的 python 绑定。通过容器、流、包、编解码器和帧直接和精确地访问媒体。它公开了一些数据的转换,并帮助您从其他包(例如 Numpy 和 Pillow )获取数据。

目前测试的视频格式有 mp4 和 avi,其他格式还没有进行测试,以下是我们提供的测试视频供确认效果。

共有2个测试视频,将这里得到的视频存放到 Linux 系统的 root 目录中,将 path_to_video 的参数修改成所存放视频路径。

注意,请尽量使用我们所提供的测试视频进行视频播放,因为视频播放对视频编码格式、音频编码格式以及尺寸有要求。文件名为 "badapple_240_60fps.mp4" 测试视频的视频编码格式为:h264,测试视频的音频编码格式为:aac,大小为 240 x 240,如果想要播放自己的视频,请先检查视频格式是否符合要求。

import pyaudio, av
from maix import display, camera, image
try:
    # recommend flv
    # ffmpeg -r 30 -i bad_apple.mp4 -s 240x240 output.mp4
    # adb push ./output.mp4 /mnt/UDISK/
    # adb push ./test.py / && adb shell 'python ./test.py'
    path_to_video = '/root/badapple_240_60fps.mp4'
    container = av.open(path_to_video)
    ai_stream = container.streams.audio[0]
    vi_stream = container.streams.video[0]
    fifo = av.AudioFifo()
    p = pyaudio.PyAudio()
    ao = p.open(format=pyaudio.paFloat32, channels=2, rate=22050, output=True)
    for frame in container.decode(video=0, audio=0):
        if 'Audio' in repr(frame):
            frame.pts = None
            fifo.write(frame)
            for frame in fifo.read_many(4096):
                ao.write(frame.planes[0].to_bytes())
        if 'Video' in repr(frame):
            img = image.Image().load(bytes(frame.to_rgb().planes[0]))

            display.show(img)

finally:
    ao.stop_stream()
    ao.close()
    p.terminate()