用来分离文件,源码如下:
#! /usr/bin/env python
#coding=utf-8
import ctypes
import struct
import sys
import os
def extract_vedio_audio(in_path, output_path):
if output_path[-1] <> '\\':
output_path += '\\'
file_data = open(in_path, "rb").read()
file_len = len(file_data)
audio_left = open(output_path + "audio_left.dat", "wb")
audio_right = open(output_path + "audio_right.dat", "wb")
video_left = open(output_path + "video_left.dat", "wb")
video_right = open(output_path + "video_right.dat", "wb")
audio_left_count = 0
audio_right_count = 0
video_left_count = 0
video_right_count = 0
audio_left_data = ""
audio_right_data = ""
video_left_data = ""
video_right_data = ""
if (file_len>0):
frame_total = struct.unpack_from("<I", file_data, 0)[0]
print frame_total
count = 0 #帧计数器
cur_pos = 4 #当前的位置
while (count <> frame_total):
head = file_data[cur_pos:cur_pos+20]
frame_index, const_2, side, frame_len, minisecond = struct.unpack_from("5I", head, 0)
print "count:%d frame_index:%d const_2:%d side:%d frame_len:0x%x time:0x%x"%(count, frame_index,const_2,side,frame_len,minisecond)
cur_pos += 20
frame_data = file_data[cur_pos:cur_pos+frame_len]
kind, unknow, a_or_v = struct.unpack_from("<BHI", frame_data, 0)
if side == 0: #左边
if a_or_v == 0x80012d00:
audio_left_data += head+frame_data
audio_left_count += 1
elif a_or_v == 0x80032d00:
video_left_data += head+frame_data
video_left_count += 1
elif side == 1: #右边
if a_or_v == 0x80012d00:
audio_right_data += head+frame_data
audio_right_count += 1
elif a_or_v == 0x80032d00:
video_right_data += head+frame_data
video_right_count += 1
cur_pos += frame_len
count += 1
#print count, frame_total
print"left audio total:%d right audio total:%d"%(audio_left_count, audio_right_count)
print"left vedio total:%d right vedio total:%d"%(video_left_count, video_right_count)
#s = struct.Struct('4s')
#s_buffer = ctypes.create_string_buffer(s.size)
if audio_left_count<>0:
#struct.pack_into('4s', s_buffer, 0, audio_left_count)
s_buffer = struct.pack('I', audio_left_count)
#print repr(s_buffer)
audio_left_data = s_buffer + audio_left_data
audio_left.write(audio_left_data)
if audio_right_count<>0:
#s.pack_into(s_buffer, 0, audio_right_count)
s_buffer = struct.pack('I', audio_right_count)
#print s_buffer
audio_right_data = s_buffer + audio_right_data
audio_right.write(audio_right_data)
if video_left_count<>0:
s_buffer = struct.pack('I', video_left_count)
video_left_data = s_buffer + video_left_data
video_left.write(video_left_data)
if video_right_count<>0:
s_buffer = struct.pack('I', video_right_count)
video_right_data = s_buffer + video_right_data
video_right.write(video_right_data)
audio_left.close()
audio_right.close()
video_left.close()
video_right.close()
def usage():
print 'Usage: audio_video_extract.py [file] [output path]'
if __name__ == '__main__':
if len(sys.argv) <> 3:
usage()
sys.exit(0)
if (not os.path.exists(sys.argv[1])):
print '[-] Invalid file path: %s!' % sys.argv[1]
sys.exit(0)
if (not os.path.exists(sys.argv[2])):
print '[-] Invalid output path: %s!' % sys.argv[2]
sys.exit(0)
filename = sys.argv[1]
output_path = sys.argv[2]
print '[+] extracting audio and video file in ' + sys.argv[1]
print "\n"
extract_vedio_audio(filename, output_path)
print '[+] extracting finished!'