Εφτιαξα μια δική μου έκδοση του readline διαβάζοντας ένα-ένα χαρακτήρα με το read(1).
Ορίστε:
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
import subprocess
import sys
import re
import datetime
child = subprocess.Popen("ffmpeg -i test.mp3 test2.mp3", shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
complete = False
myline = ''
while True:
out = child.stderr.read(1)
if out == '' and child.poll() != None:
break
#create myline string
myline += out
if out in ('\r','\n'):
#print(myline)
# Duration / start
m = re.search("Duration: ([0-9:.]+), start: ([0-9.]+)", myline)
if m:
# duration in hh:mm:ss format
m_duration = m.group(1)
# start (in seconds?)
m_start = m.group(2)
print("Duration: {0}, start: {1}".format(m_duration, m_start))
n = re.search("time=([0-9.]+)", myline)
if n:
n_tpassed = float(n.group(1))
n_dt = datetime.timedelta(seconds=n_tpassed)
print("time processed: {0} out of {1}".format(n_dt, m_duration))
# Calculate time left:
tformat = '%H:%M:%S.%f'
tdelta = datetime.datetime.strptime(m_duration, tformat) - datetime.timedelta(seconds=n_tpassed)
# Sometimes ffmpeg shows more time processed than the end time. It reverts the date to 1899 and shows a ValueError.
if tdelta.year != 1899:
# The datetime module calculates according to date and time. date is set as 1900-01-01 and we don't need that.
print("Time left to process: {0}".format(tdelta.strftime("%H:%M:%S")))
#reset myline
myline = ''
Από καιρό ήθελα να παίξω με το datetime, αφορμή να μάθω πώς λειτουργεί.
Δεν λαμβάνει υπόψη το start second όταν υπολογίζει το χρόνο που έμεινε.





