一个python脚本

用来分离文件,源码如下:

#! /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!'
   
        


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值