常规多进程视频处理
假设你要开发一款视频分析应用,需要同时接入两路视频,且两路画面都需要人脸检测功能。为了充分利用设备资源,视频解码要在昇腾芯片上实现。一种可能的应用设计如下:

该设计包含了两个进程,进程1负责接入视频与图像解码;进程2负责人脸检测。两个进程通过队列在内存中交换数据。在不使用昇腾硬件的环境下,你可以使用这段代码实现:
硬件加速的视频解码
视频解码是典型的CPU繁重型任务。昇腾310芯片中有专门的硬件模块可以实现H.264/265硬件加速解码。我们可以借助该硬件模块来减轻CPU负担,加快应用运行速度。
在上一篇关于图像裁切的文章中,你已经通过昇腾应用开发的Python SDK pyACL实现了图像的区域裁切。视频解码的开发过程与其非常类似,充斥着大量有着“奇怪”名字的API。在这里我们将引入一款由华为FAE工程师进一步封装后的Python SDK:AscendFly。它将常用功能封装为模块,然后对外提供类似OpenCV风格的接口,可以有效提升开发效率。
常规多进程视频处理
假设你要开发一款视频分析应用,需要同时接入两路视频,且两路画面都需要人脸检测功能。为了充分利用设备资源,视频解码要在昇腾芯片上实现。一种可能的应用设计如下:
该设计包含了两个进程,进程1负责接入视频与图像解码;进程2负责人脸检测。两个进程通过队列在内存中交换数据。在不使用昇腾硬件的环境下,你可以使用这段代码实现:
"""Template code for video frame processing.""" import multiprocessing as mp import cv2 BUFFER_SIZE = 12 RUNNING = mp.Value("i", 1) def get_frames(srcs, q: mp.Queue): """子进程对象。用于视频流解码,并将解码后的图像填充到队列中。""" caps = [cv2.VideoCapture(src) for src in srcs] print("Opening streams...") while RUNNING.value == 1: for i, cap in enumerate(caps): _, frame = cap.read() q.put((frame, i)) print("Streaming stopped.") def main(): # 设定视频源 video_srcs = ['/home/robin/Videos/pose.mp4', '/home/robin/Videos/mask.mp4', ] # 构建用于交换数据的队列 frame_q = mp.Queue(maxsize=BUFFER_SIZE) # 构建进程并启动它 p = mp.Process(target=get_frames, args=(video_srcs, frame_q,)) p.start() # 预览图像。 while RUNNING.value == 1: frame, cap_id = frame_q.get() frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5) cv2.imshow('{}'.format(cap_id), frame) if cv2.waitKey(1) == 27: RUNNING.value = 0 print("Closing queue...") frame_q.close() print("Joining process...") p.terminate() print("All done.") if __name__ == "__main__": main()硬件加速的视频解码
视频解码是典型的CPU繁重型任务。昇腾310芯片中有专门的硬件模块可以实现H.264/265硬件加速解码。我们可以借助该硬件模块来减轻CPU负担,加快应用运行速度。
在上一篇关于图像裁切的文章中,你已经通过昇腾应用开发的Python SDK pyACL实现了图像的区域裁切。视频解码的开发过程与其非常类似,充斥着大量有着“奇怪”名字的API。在这里我们将引入一款由华为FAE工程师进一步封装后的Python SDK:AscendFly。它将常用功能封装为模块,然后对外提供类似OpenCV风格的接口,可以有效提升开发效率。