(python 3) 从 .h264 自动转换为 .mp4
(python 3) Auto-Conversion from .h264 to .mp4
我有一个 Python 3 代码,用于录制视频。不幸的是,我不想要它在 .h264 中,我需要它转换为 .mp4。使用其他 Whosebug 线程作为模板(特别是 this 一个),我认为最简单的方法是使用 subprocess.Popen
将 MP4Box -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"
Comment: 2017-07-11_15.34.49.h264.h264
你的Filepath/Filename不对,改成如下:
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
.
我有一个 Python 3 代码,用于录制视频。不幸的是,我不想要它在 .h264 中,我需要它转换为 .mp4。使用其他 Whosebug 线程作为模板(特别是 this 一个),我认为最简单的方法是使用 subprocess.Popen
将 MP4Box -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"
Comment: 2017-07-11_15.34.49.h264.h264
你的Filepath/Filename不对,改成如下:
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
.