AS-B
@AS-B

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

RaspberryPiでの録画方法について

解決したいこと

RaspberryPiでUSBカメラでの動画を延々と録画していくというプログラムを書きました。
可能な限り長時間撮影したかったため、USBメモリに移動させて保存していき、いっぱいになったところでUSBメモリを交換するという流れで2か月程度稼働しておりました。
しかしSDが壊れてしまい、バックアップも同時に壊れてしまったため組み直しておりますが、shutil.move後の動画ファイルが「ファイルを再生できません。このアイテムのファイル形式がサポートされていないか、ファイル拡張子が正しくないか、ファイルが破損している可能性があります。」となり、うまく保存できなくなってしまいました。
プログラミング初心者のため以前のコードもあまり覚えておらず、何が原因かもわからず困り果てております。
因みにshutil.copyで作成したデータは、ローカルだと再生でき、USBメモリだと再生不可です。
USBメモリ単体での使用(コピーしたり、消したり、差し直したり)も特に異常は見受けられません。
何かお分かりになる方いらっしゃいましたらお力添えください。

発生している問題・エラー

shutil.move後、USBメモリのMP4ファイルが「ファイルを再生できません。このアイテムのファイル形式がサポートされていないか、ファイル拡張子が正しくないか、ファイルが破損している可能性があります。」となる。

該当するソースコード

#!/usr/bin/python3
#coding: utf-8

import cv2
import datetime
import shutil

cap = cv2.VideoCapture(0)
if(cap==None):
    print("Camera not found")

print("start")

ret, frame = cap.read()

def recording():
    loop = int(fps * rec_time)
    for i in range(loop):
        ret, frame = cap.read()
        frame = cv2.flip(frame,0)
        video.write(frame)

while True:
    rec_time = 10#sec
    fps = int(cap.get(cv2.CAP_PROP_FPS))
    fps = 25.0
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    name = "video" + datetime.datetime.today().strftime('%Y%m%d_%H%M%S') + ".mp4"
    video = cv2.VideoWriter(name, fourcc, fps, (w,h))
    path = "/home/pi/"+ name

    recording()
    print("save")
    shutil.move(path,"/media/pi/USBメモリの名称/")
    video.release()

    if(cap==None):
        print("Camera not found")
        break

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

print("stop")
print("fps =",fps)
print("size =",w,h)
video.release()
cap.release()
cv2.destroyAllWindows()

自分で試したこと

・shutil.copyで作成。→ローカルだと再生でき、USBメモリだと再生不可。
・USBメモリ単体での使用(コピーしたり、消したり、差し直したり)での異常はない。

0

1Answer

憶測での回答ですが・・・
cmpコマンドでローカルファイルとUSBメモリファイルを比較してみましたか?
ファイル保存完了前に shutils.move が実行されているということはありませんか?
sleep で少し時間を空けてみるとか、video.release() してから shutils.move してみるとどうでしょうか?

1Like

Comments

  1. @AS-B

    Questioner

    仰る通りでvideo.release() してからの shutils.move で解決できました!
    ご回答いただきありがとうございました。
  2. 解決して良かったです。
    質問のクローズをお願いします。

Your answer might help someone💌