喜欢coding,因为那是一件伟大的事情,是将无生命的IC赋予灵魂的过程,让我拥有了和上帝一样的成就感。(w1c2g3@163.com)
全部博文(60)
分类: Python/Ruby
2013-02-17 11:48:40
#!/usr/bin/env python
import string, os, sys
import matplotlib.pyplot as plt
import numpy as np
from random import randrange
import threading
msg_file = "data"
#const
stream_count = 10
#variable
packet_enable = False
pkt_count = 0
vpkt_count = 0
apkt_count = 0
stream = []
last_pos = []
cur_id = 0
cur_stream = ""
color = ['#ff0000', '#00ff00', '#0000ff']
show_all = False
################################################################################################################
# print software about
################################################################################################################
def print_software_about():
print '#################################################################'
print '# Parse Shit 1.0'
print '#'
print '# If U find the software is a shit too, don\'t contact Chenggang'
print '#################################################################'
print ''
print ''
print ''
################################################################################################################
# init variable
################################################################################################################
def init_variable():
global stream
for i in range(0, stream_count):
last_pos.append(0)
stream.append({})
stream[i]['codec_type'] = ''
stream[i]['pts'] = []
stream[i]['pts_time'] = []
stream[i]['dts'] = []
stream[i]['dts_time'] = []
stream[i]['duration'] = []
stream[i]['duration_time'] = []
stream[i]['size'] = []
stream[i]['pos'] = []
stream[i]['flags'] = []
color.append("#%06s" % "".join([hex(randrange(0, 255))[2:] for i in range(3)]))
################################################################################################################
# run ffprobe
################################################################################################################
def run_ffprobe():
global show_all
usage = sys.argv[0] + ' [filename]'
if len(sys.argv) < 2:
print 'Usage:'
print usage
sys.exit()
elif not sys.argv[1]:
print 'input filename = null'
print usage
sys.exit()
elif not os.path.isfile(sys.argv[1]):
print 'No find the file: %s' % sys.argv[1]
print usage
sys.exit()
if len(sys.argv) > 2:
show_all = True
return_status = os.system('ffprobe -show_packets ' + sys.argv[1] + ' > ' + msg_file)
################################################################################################################
# parser file
################################################################################################################
def parser_file():
global msg_file
global stream_count
global packet_enable
global pkt_count
global vpkt_count
global apkt_count
global stream
global cur_id
global cur_stream
global last_pos
fp = open(msg_file, 'r')
for line in fp.readlines():
line = line.strip("\n")
if line == "[PACKET]":
packet_enable = True
pkt_count += 1
elif line == "[/PACKET]":
packet_enable = False
if packet_enable:
parts = line.split('=')
if parts[0] == "codec_type":
cur_stream = parts[1]
elif parts[0] == "stream_index":
cur_id = int(parts[1])
if not stream[cur_id]['codec_type']:
stream[cur_id]['codec_type'] = cur_stream
elif parts[0] == "pts":
if parts[1] == 'N/A':
stream[cur_id]['pts'].append(0)
else:
stream[cur_id]['pts'].append(int(parts[1]))
elif parts[0] == "pts_time":
if parts[1] == 'N/A':
stream[cur_id]['pts_time'].append(0.0)
else:
stream[cur_id]['pts_time'].append(float(parts[1]))
elif parts[0] == "dts":
if parts[1] == 'N/A':
stream[cur_id]['dts'].append(0)
else:
stream[cur_id]['dts'].append(int(parts[1]))
elif parts[0] == "dts_time":
if parts[1] == 'N/A':
stream[cur_id]['dts_time'].append(0.0)
else:
stream[cur_id]['dts_time'].append(float(parts[1]))
elif parts[0] == "duration":
if parts[1] == 'N/A':
stream[cur_id]['duration'].append(0)
else:
stream[cur_id]['duration'].append(int(parts[1]))
elif parts[0] == "duration_time":
if parts[1] == 'N/A':
stream[cur_id]['duration_time'].append(0.0)
else:
stream[cur_id]['duration_time'].append(float(parts[1]))
elif parts[0] == "size":
if parts[1] == 'N/A':
stream[cur_id]['size'].append(0)
else:
stream[cur_id]['size'].append(int(parts[1]))
elif parts[0] == "pos":
if parts[1] == 'N/A':
stream[cur_id]['pos'].append(last_pos[cur_id])
else:
stream[cur_id]['pos'].append(int(parts[1]))
last_pos[cur_id] = int(parts[1])
elif parts[0] == "flags":
stream[cur_id]['flags'].append((parts[1]))
fp.close()
#print stream
################################################################################################################
# draw chart
################################################################################################################
def show_chart(num, x, y):
global stream
global stream_count
global color
plt.figure(num)
for i in range(0, stream_count):
codec_type = stream[i]['codec_type']
if not codec_type:
continue
plt.plot(stream[i][x], stream[i][y], color=color[i], marker='o', label=codec_type+str(i))
plt.xlabel(x)
plt.ylabel(y)
plt.title(x + '-' + y)
plt.legend()
################################################################################################################
# mutil thread
################################################################################################################
option = [[False, 'pos', 'pts'],\
[False, 'pos', 'pts_time'],\
[False, 'pos', 'dts'],\
[False, 'pos', 'dts_time'],\
[False, 'pos', 'duration'],\
[False, 'pos', 'duration_time'],\
[False, 'pos', 'size'],\
[False, 'pos', 'pos']\
]
class chartThread(threading.Thread):
global show_all
def __init__(self,threadname):
threading.Thread.__init__(self,name=threadname)
def run(self):
if show_all:
for n in range(0, len(option)):
show_chart(n, option[n][1], option[n][2])
plt.show()
else:
show_chart(0, option[0][1], option[0][2])
plt.show()
################################################################################################################
# main
################################################################################################################
print_software_about()
init_variable()
run_ffprobe()
parser_file()
thread = chartThread('0')
thread.setDaemon(True)
thread.start()
while True:
key = raw_input("Press q exit:")
if key == 'q':
sys.exit()