2013-02-27 3 views
0

비디오 파일의 ffprobe 값을 다른 사람과 비교하거나 값을 데이터베이스로 옮길 수있는 변수로 가져 오려고합니다. 내가 가진 질문. 아래보다 더 좋은 방법이 있습니까?ffprobe의 출력을 변수로 가져 오려고 시도했습니다.

if/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