.. _py_video: 6. 录制视频 ================== 本示例将演示如何使用视频录制功能。 **运行代码** .. raw:: html .. code-block:: cd ~/picrawler/examples sudo python3 6_record_video.py 代码运行后,可以在浏览器中输入 ``http://:9000/mjpg`` 来查看实时画面,例如: ``http://192.168.18.113:9000/mjpg`` .. image:: img/display.png 通过键盘按键可以开始或停止录制。 * 按下 ``q`` 开始录制,或实现暂停/继续;按下 ``e`` 停止录制并保存视频。 * 若要退出程序,请按 ``Ctrl+C`` 。 **代码** .. code-block:: python from time import sleep, strftime, localtime from vilib import Vilib import readchar from os import getlogin import os USERNAME = getlogin() VIDEO_PATH = f"/home/{USERNAME}/Videos/" MANUAL = ''' Press keys on keyboard to control recording: Q: record/pause/continue E: stop Ctrl+C: Quit ''' def print_overwrite(msg, end='', flush=True): """Overwrite the current terminal line.""" print('\r\033[2K', end='', flush=True) print(msg, end=end, flush=True) def safe_stop_recording(): """Stop recording safely (avoid exceptions during exit).""" try: Vilib.rec_video_stop() except Exception: pass def safe_close_camera(): """Close camera safely (avoid exceptions during exit).""" try: Vilib.camera_close() except Exception: pass def main(): rec_flag = 'stop' # Possible states: start, pause, stop vname = None # Ensure the video directory exists os.makedirs(VIDEO_PATH, exist_ok=True) # Set save path for recorded videos Vilib.rec_video_set["path"] = VIDEO_PATH # Start camera and preview Vilib.camera_start(vflip=False, hflip=False) Vilib.display(local=False, web=True) sleep(0.8) # Wait for camera startup print(MANUAL) try: while True: # Read keyboard input (no Enter needed) key = readchar.readkey().lower() # Q: start / pause / continue if key == 'q': if rec_flag == 'stop': rec_flag = 'start' # Generate filename based on timestamp vname = strftime("%Y-%m-%d-%H.%M.%S", localtime()) Vilib.rec_video_set["name"] = vname # Start recording Vilib.rec_video_run() Vilib.rec_video_start() print_overwrite('rec start ...') elif rec_flag == 'start': rec_flag = 'pause' Vilib.rec_video_pause() print_overwrite('pause') elif rec_flag == 'pause': rec_flag = 'start' Vilib.rec_video_start() print_overwrite('continue') # E: stop recording elif key == 'e' and rec_flag != 'stop': rec_flag = 'stop' safe_stop_recording() print_overwrite( "The video saved as %s%s.avi" % (Vilib.rec_video_set["path"], vname), end='\n' ) # Ctrl+C (readchar special key): quit elif key == readchar.key.CTRL_C: print('\nquit') break sleep(0.1) except KeyboardInterrupt: # Handle Ctrl+C from terminal as well print('\nquit') finally: # If recording is still active, stop it before closing camera if rec_flag != 'stop': safe_stop_recording() safe_close_camera() sleep(0.1) if __name__ == "__main__": main() **它是如何工作的?** #. 程序功能 该程序允许你使用键盘控制视频录制。 • Q → 开始 / 暂停 / 继续录制 • E → 停止录制 • Ctrl+C → 退出程序 录制的视频将保存在 ``Videos`` 文件夹中。 #. 准备视频保存文件夹 .. code-block:: python USERNAME = getlogin() VIDEO_PATH = f"/home/{USERNAME}/Videos/" os.makedirs(VIDEO_PATH, exist_ok=True) 程序会获取当前系统用户名, 如果 ``Videos`` 文件夹不存在,则会自动创建。 所有录制的视频都会保存到该目录。 #. 启动摄像头 .. code-block:: python Vilib.camera_start(vflip=False, hflip=False) Vilib.display(local=False, web=True) sleep(0.8) 启动摄像头。 同时启用网页预览功能, 你可以在浏览器中观看实时视频流。 短暂延时用于确保摄像头正常启动。 #. 录制状态设置 .. code-block:: python rec_flag = 'stop' vname = None 程序使用变量 ``rec_flag`` 来记录当前的录制状态: • stop → 未录制 • start → 正在录制 • pause → 暂停录制 #. 等待键盘输入 .. code-block:: python key = readchar.readkey().lower() 程序会等待用户按下一个键。 #. 按 Q 开始录制 .. code-block:: python if rec_flag == 'stop': vname = strftime("%Y-%m-%d-%H.%M.%S", localtime()) Vilib.rec_video_set["name"] = vname Vilib.rec_video_run() Vilib.rec_video_start() 当你第一次按下 Q 时: • 程序会根据当前日期和时间生成文件名 • 视频录制会立即开始 示例文件名: 2026-03-03-15.30.21.avi #. 再次按 Q 暂停录制 .. code-block:: python elif rec_flag == 'start': Vilib.rec_video_pause() 如果当前正在录制, 再次按下 Q 会暂停录制。 #. 再次按 Q 继续录制 .. code-block:: python elif rec_flag == 'pause': Vilib.rec_video_start() 如果当前处于暂停状态, 再次按下 Q 会继续录制。 #. 按 E 停止录制 .. code-block:: python elif key == 'e' and rec_flag != 'stop': Vilib.rec_video_stop() 按下 E 会完全停止录制。 视频文件会保存到: ``/home/your_username/Videos/`` #. 安全退出程序 .. code-block:: python finally: if rec_flag != 'stop': Vilib.rec_video_stop() Vilib.camera_close() 当程序退出时: • 如果仍在录制,会先停止录制 • 然后安全关闭摄像头 这样可以避免视频文件损坏或摄像头异常。