【问题标题】:Making a sequential playlist of videos in python在 python 中制作视频的顺序播放列表
【发布时间】:2021-11-09 03:54:22
【问题描述】:

我正在尝试运行一个视觉行为实验,其中一个文件夹中的一大堆视频一个接一个地播放。我需要在 python 中执行此操作,因为我有一个 TTL 脉冲发生器,我需要在每个视频的开头和结尾运行它。

我正在使用 cv2 并尝试播放视频,但由于我无法弄清楚的原因,我无法让它们按顺序播放

附上我的代码

import cv2
import os
import random

videofolderPath = '/folderwithfiles'
videos = []
playlist = []
for file in os.listdir(videofolderPath):
  if file.lower().endswith(".mp4"):
    path=os.path.join('/folderwithfiles/',file)
    playlist.append(path)
    

random.shuffle(playlist)

for i in range (3):
  i += 1
  cap = cv2.VideoCapture(playlist[i])
  print(playlist[i])

  while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q') or ret==False :
      cap.release()
      cv2.destroyAllWindows()
      break
    cv2.imshow('frame',frame)
  cap.release()
  cv2.destroyAllWindows()

我遇到的问题是我认为他们都在同时播放。当我按 q 时,我确实看到了它后面的另一个视频,但我很难让它们一个接一个地播放。

【问题讨论】:

    标签: python opencv psychopy


    【解决方案1】:

    您似乎遇到了错误,因为您尝试在测试 if ret == False 之前显示视频。

    此外,您应该在循环结束时更新 i,因为 python 索引是从零开始的

    修复如下所示:(请注意,我更改了视频文件夹路径以测试您的代码)

    import cv2
    import os
    import random
    
    videofolderPath = './videos'
    videos = []
    playlist = []
    for file in os.listdir(videofolderPath):
        if file.lower().endswith(".mp4"):
            path = os.path.join(videofolderPath, file)
            playlist.append(path)
    
    random.shuffle(playlist)
    
    for i in range(3):
        cap = cv2.VideoCapture(playlist[i])
        print(playlist[i])
    
        while True:
            ret, frame = cap.read()
            # REMOVE cv2.imshow(f'frame_{i}', frame)
            if cv2.waitKey(1) & 0xFF == ord('q') or ret == False:
                cap.release()
                cv2.destroyAllWindows()
                break
            cv2.imshow('frame', frame)
        cap.release()
        cv2.destroyAllWindows()
    
        i += 1 # UPDATE INDEX AT THE END
    

    编写代码的更好方法是这样的:

    import cv2
    import os
    
    if __name__ == '__main__':
        video_folder = "./videos"
        for video_name in os.listdir(video_folder):
            if not video_name.endswith(".mp4"):
                continue
            video_path = os.path.join(video_folder, video_name)
    
            video = cv2.VideoCapture(video_path)
    
            while True:
                ret, frame = video.read()
                if not ret:
                    break
                cv2.imshow("video", frame)
                cv2.waitKey(1)
    
            video.release()
    
        cv2.destroyAllWindows()
    

    另外,我建议您查看线程以“并行”加载视频,因为它非常占用 CPU 资源

    【讨论】:

    • 没有任何线程不需要。他想按顺序阅读/展示它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多