2013-02-27 48 views
0

我想抓住從視頻文件中的ffprobe值代入,我可以比較反對其他或移動值到數據庫中的變量。我有這個問題;有沒有比下面更好的方法?試圖讓ffprobe的輸出爲可變

我不喜歡多如果/ elif的/ line.startswith聲明,我不知道分裂的是獲得ffprobe值的最佳方式?

#!/usr/bin/python 
import os, sys, subprocess, shlex, re, fnmatch 
from subprocess import call 

videoDrop_dir="/mnt/VoigtKampff/Temp/_Jonatha/test_drop" 

for r,d,f in os.walk(videoDrop_dir): 
    for files in f: 
     print "Files: %s" % files 
     if files.startswith(('._', '.')): 
      print "This file: %s is not valid" % files 
     elif files.endswith(('.mov', '.mpg', '.mp4', '.wmv', '.mxf')): 
      fpath = os.path.join(r, files) 
      def probe_file(fpath): 
       cmnd = ['ffprobe', '-show_format', '-show_streams', '-pretty', '-loglevel', 'quiet', fpath] 
       p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
       print files 
       out, err = p.communicate() 
       print "===============================OUTPUT START: %s ===============================" % files 
       print out 
       for line in out.split('\n'): 
       line = line.strip() 
       if line.startswith('codec_name='): 
        s = line 
        codec_name = s.split('codec_name=', 1) 
        print "Codec is: %s" % codec_name[1] 
        codec_1 = codec_name[1] 
       elif line.startswith('codec_type='): 
        s = line 
        codec_type = s.split('codec_type=', 1) 
        print "Codec type is: %s" % codec_type[1] 
        codec_type1 = codec_type[1] 
       elif line.startswith('codec_long_name=', 1): 
        s = line 
        codec_long_name = s.split('codec_long_name=', 1) 
        print "Codec long name: %s" % codec_long_name[1] 
        codec_long_name = codec_long_name[1] 
       elif line.startswith('format_long_name=', 1): 
        s = line 
        format_long_name = s.split('format_long_name=', 1) 
        print "Format long name: %s" % format_long_name[1] 
        format_long_name = format_long_name[1] 
       elif line.startswith('width='): 
        s = line 
        width = s.split('width=', 1) 
        print "Video pixel width is: %s" % width[1] 
        p_width = width[1] 
       elif line.startswith('height='): 
        s = line 
        height = s.split('height=', 1) 
        print "Video pixel height is: %s" % height[1] 
        p_height = height[1]  
       elif line.startswith('bit_rate='): 
        s = line 
        bit_rate = s.split('bit_rate=', 1) 
        print "Bit rate is: %s" % bit_rate[1] 
        bit_rate1 = bit_rate[1] 
       elif line.startswith('display_aspect_ratio=', 1): 
        s = line 
        display_aspect_ratio = s.split('display_aspect_ratio=', 1) 
        print "Display aspect ratio: %s" % display_aspect_ratio[1] 
        display_aspect_ratio1 = display_aspect_ratio[1] 
       elif line.startswith('avg_frame_rate=', 1): 
        s = line 
        avg_frame_rate = s.split('avg_frame_rate=', 1) 
        print "Average Frame Rate: %s" % avg_frame_rate[1] 
        avg_frame_rate1 = avg_frame_rate[1] 

      print "===============================OUTPUT FINISH: %s ===============================" % files 
      if err: 
       print "===============================ERROR: %s ===============================" % files 
       print err 
     probe_file(fpath) 
    else: 
     if not files.startswith(('.mov', '.mpg', '.mp4', '.wmv', '.mxf')): 
      print "This file: %s is not a valid video file" % files 

回答

0

這個問題,這是一個有點晚,但希望它可以幫助別人尋找一個類似的答案。

import json, subprocess 

# grab info about video_file 
ffprobe_cmd = '/home/ubuntu/bin/ffprobe -v quiet -print_format json -show_format -show_streams - i ' + v + ' 2>&1' 
# print ffprobe_cmd   
s = subprocess.Popen(ffprobe_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

ffprobe_out, err = s.communicate() 

ffprobe_dict = json.loads(ffprobe_out) 

從這裏,我再次使用的常用方法,search_dict,它可以像使用:

search_dict(ffprobe_dict, 'height') 

def search_dict(my_dict, field): 
"""Takes a dict with nested lists and dicts, 
and searches all dicts for a key of the field 
provided. 
""" 
fields_found = [] 

for key, value in my_dict.iteritems(): 

    if key == field: 
     fields_found.append(value) 

    elif isinstance(value, dict): 
     results = search_dict(value, field) 
     for result in results: 
      fields_found.append(result) 

    elif isinstance(value, list): 
     for item in value: 
      if isinstance(item, dict): 
       more_results = search_dict(item, field) 
       for another_result in more_results: 
        fields_found.append(another_result) 

return fields_found