(python 3)从.h264到.mp4的自动转换

2024-04-29 19:02:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python 3代码,应该用来录制视频。不幸的是,我不希望它在.h264中,我需要它转换成.mp4。使用其他StackOverflow线程作为模板(特别是this),我认为最简单的方法是使用subprocess.PopenMP4Box -add filename.h264 filename.mp4插入到终端中并让它自动为我执行。不幸的是,Python脚本没有做任何事情,也没有收到任何错误消息,所以我不知道出了什么问题。.h264文件出现在我希望它出现的文件夹中,如果我手动将该命令放入终端中,.mp4就会出现,但当我让它运行时什么也不会发生。剧本的其余部分很有魅力。代码在这里:

#!/usr/bin/python

from gpiozero import MotionSensor
from gpiozero import Motor
from picamera import PiCamera
import subprocess
import os.path
import shlex
import datetime as dt
from time import sleep

camera = PiCamera()
pir = MotionSensor(4, 1, 100, .6, False)
motor = Motor(3,14) #first number is forwards, second is backwards
startupTime = 1
recordingTime = 1
collectionTime = 3
resetTime = 30



while True:
    sleep(startupTime) #delay a bit so installation can take place

    #wait for motion, then move the motor back and forth
    pir.wait_for_motion() 
    print("Motion Detected")
    #moves motor forward for 3 seconds at 25% speed
    motor.forward(.25)
    print("Strip Extending")
    sleep(3) 
    motor.stop()
    #leaves strip out for given amount of time
    print("Collecting Sample")
    sleep(collectionTime) 
    #moves motor backward for 3 seconds at 50% speed
    motor.backward(.5)
    print("Strip Retracting")
    sleep(3) 
    motor.stop()

    #Prep file for correct saving
    filename = dt.datetime.now().strftime("%Y-%m-%d_%H.%M.%S.h264") #saves file as a date
    save_path= "/home/pi/ANALYSIS"
    completed_video= os.path.join(save_path, filename)

    #Start recording
    camera.start_recording(completed_video) #starts recording and saves it as filename
    print("Camera Recording")
    camera.annotate_text = dt.datetime . now() . strftime("%Y-%m-%d_%H.%M.%S")
    start=dt.datetime.now()

    #Keep recording until time runs out, annotate to make sure we have reference frame
    while (dt.datetime.now() - start).seconds < recordingTime: 
        camera.annotate_text = dt.datetime.now(). strftime("%Y-%m-%d_%H.%M.%S")
        camera.wait_recording(.2)
    camera.stop_recording()

    #Conversion to usable file format
    print("Camera finished recording... Beginning Analysis")
    from subprocess import CalledProcessError
    command = shlex.split("MP4Box -add {} {}.mp4".format(completed_video, os.path.splitext(filename)[0]))
    try:
        output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
    except CalledProcessError as e:
        print('FAIL:\ncmd:{}\noutput:{}'.format(e.cmd, e.output))

    #starts detecting again after given time
    sleep(resetTime)
    print("Ready for next sample")

>Traceback (most recent call last):  
>
    File "/home/pi/Detector.py", line 62, in <module> output = 
      subprocess.check_output(command, stderr=subprocess.STDOUT) 
    File "/usr/lib/python3.4/subprocess.py", line 620, in check_output raise 
      CalledProcessError(retcode, process.args, output=output) 
      subprocess.CalledProcessError: 
        Command '['MP4Box', '-add', '2017-07-11_15.34.49.h264.h264', '2017-07-11_15.34.49.h264.mp4']' 
>
Returned non-zero exit status 1"

Tags: fromimportforoutputdatetimedtsleepfilename
1条回答
网友
1楼 · 发布于 2024-04-29 19:02:22

Comment: 2017-07-11_15.34.49.h264.h264

文件路径/文件名错误,请更改为以下内容:

Note: The .mp4 is saved in to the Current Directory the Subprocess is executed,
the Directory the Python Script is started. This could be different as the .h264 are saved!
Think about to change that also to be a absolute Path.

command = "MP4Box -add {} {}.mp4".format(completed_video, os.path.splitext(filename)[0])
try:
    output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
except subprocess.CalledProcessError as e:
    print('FAIL:\ncmd:{}\noutput:{}'.format(e.cmd, e.output))

os.remove(path, *, dir_fd=None)

Remove (delete) the file path.


Question: I don't get any error messages, so I don't know what's going wrong.

尝试以下操作:
要同时捕获结果中的标准错误,请使用stderr=subprocess.STDOUT

command = shlex.split("MP4Box -add {f}.h264 {f}.mp4".format(f=filename))
output = subprocess.check_output(command, stderr=subprocess.STDOUT)
print(output)

我假设您需要shell=True,因为您没有给出MP4Box的完整路径,所以需要一个Shell环境来查找MP4Box

相关问题 更多 >