2012-03-27 6 views
7

के साथ एफएफप्रोब जानकारी प्राप्त करना मैं हमेशा के लिए इसे बाहर निकालने का प्रयास कर रहा हूं (मैं प्रोग्रामिंग के लिए नया हूं) और मैं इसे समझ नहीं सकता।पाइथन

मैं एक ऐसी स्क्रिप्ट बनाने का प्रयास कर रहा हूं जो फ़ाइल का परीक्षण करेगी, और मुझे आउटपुट दें जिससे मुझे "ऑडियो प्रारूप" जैसी जानकारी मिल सकती है जिसे मैं फ़ाइल नाम में डाल सकता हूं। हालांकि, मैं किसी भी फ़ाइल जानकारी को वापस करने के लिए स्क्रिप्ट भी प्राप्त नहीं कर सकता। मैंने एक इनपुट फ़ाइल डालने पर एक दीवार मारा है ...

तो इस बिंदु पर मुझे केवल उन तर्कों के आधार पर जानकारी थूकने में मदद की ज़रूरत है, जिन्हें मैंने फेंक दिया है। उम्मीद है कि मैं इसे समझने में सक्षम हूं उस से ऑडियो जानकारी का विश्लेषण कैसे करें।

मेरे प्रयास है कि बंद हो रहा है:

#!/usr/bin/python 
import os, sys, subprocess, shlex, re 
from subprocess import call 
def probe_file(filename): 
    p = subprocess.Popen(['/opt/local/bin/ffprobe', '-show_format', '-pretty', '-loglevel quiet', -i filename], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 
    print filename 
    print p.communicate() 
[probe_file (f) for f in os.listdir('.') if not f.startswith('.')] 

उत्तर

8

अपने कोड popen को

  1. आर्ग सूची में कुछ समस्याएं हैं जो एक सिंटैक्स त्रुटि उपयोग '-i '+filename बजाय
  2. -i filename के रूप में अंतिम तर्क है shell=True आमतौर पर आवश्यक नहीं है और अनावश्यक बोझ है।

इसके अलावा यह काम करता प्रतीत होता है, क्या आप # 1 को ठीक करने के बाद आउटपुट नहीं देख रहे हैं?

संपादित करें: ऐसा लगता है आप ffprobe कमांडलाइन साथ समस्या हो रही है की तरह है, तो मैं इसे और परिवर्तन की आवश्यकता नहीं है स्थापित

  1. मेरे ffprobe (0.7.3-4 ffprobe: 0.7.3-0ubuntu0.11.10.1) -i ध्वज स्वीकार नहीं करता है, इनपुट फ़ाइल को अंतिम तर्क के रूप में पास किया गया है।
  2. आप -logelevel और logleve quiet का विकल्प पारित करने के लिए अलग तर्क यानी [..., '-loglevel', 'quiet',..]

तो इन परिवर्तनों को यहाँ के बाद के रूप में की जरूरत है एक नमूना स्क्रिप्ट

#!/usr/bin/python 
import os, sys, subprocess, shlex, re 
from subprocess import call 
def probe_file(filename): 
    cmnd = ['ffprobe', '-show_format', '-pretty', '-loglevel', 'quiet', filename] 
    p = subprocess.Popen(cmnd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    print filename 
    out, err = p.communicate() 
    print "==========output==========" 
    print out 
    if err: 
     print "========= error ========" 
     print err 

probe_file('drop.avi') 

है और मैं सही उत्पादन देखें:

==========output========== 
[FORMAT] 
filename=drop.avi 
nb_streams=1 
format_name=avi 
format_long_name=AVI format 
start_time=0:00:00.000000 
duration=0:00:06.066667 
size=660.000 Kibyte 
bit_rate=891.217 Kbit/s 
[/FORMAT] 

========= error ======== 
ffprobe version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2007-2011 the Libav developers 
    built on Jan 4 2012 16:08:51 with gcc 4.6.1 
    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=amd64 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static 
    libavutil 51. 7. 0/51. 7. 0 
    libavcodec 53. 6. 0/53. 6. 0 
    libavformat 53. 3. 0/53. 3. 0 
    libavdevice 53. 0. 0/53. 0. 0 
    libavfilter 2. 4. 0/2. 4. 0 
    libswscale 2. 0. 0/2. 0. 0 
    libpostproc 52. 0. 0/52. 0. 0 
Unsupported codec with id 114 for input stream 0 
+0

मैं हो रही है '... '/ opt/स्थानीय/bin/ffprobe: विकल्प 'i foo' \ n ") ' –

+0

@RobinHood का अर्थ है कि आप ffprobe के लिए सही पैरामीटर नहीं पारित कर रहे हैं, सबसे पहले यह देखने का प्रयास करें कि कमांड लाइन से ffprobe का सही तरीके से उपयोग कैसे करें और उसके बाद python –

+0

पर अनुवाद करें'/opt/local/bin/ffprobe -pretty -i 'foo.avi'' जानकारी लौटाता है; आदेश '/ opt/local/bin/ffprobe -pretty -i' foo.avi '\ n' नहीं करता है; लेकिन मैं यह नहीं समझ सकता कि '\ n' –

1

यहां तकनीक है जो मुझे लगता है कि यह उपयोग करने में आसान है और पार्स करने में आसान है (एफएफ के साथ परीक्षण एमपीईजी 3.x):

import subprocess 
import xml.etree 

def ffprobe(executable, filename): 
    '''Runs ``ffprobe`` executable over ``filename``, returns parsed XML 

    Parameters: 

     executable (str): Full path leading to ``ffprobe`` 
     filename (str): Full path leading to the file to be probed 

    Returns: 

     xml.etree.ElementTree: containing all parsed elements 

    ''' 

    cmd = [ 
     executable, 
     '-v', 'quiet', 
     '-print_format', 'xml', #here is the trick 
     '-show_format', 
     '-show_streams', 
     filename, 
     ] 

    return xml.etree.ElementTree.fromstring(subprocess.check_output(cmd)) 

डेटा उपलब्ध एक स्ट्रिंग प्रतिनिधित्व कि इस तरह दिखता है से आता है:

<ffprobe> 
    <streams> 
    <stream index="0" codec_name="h264" codec_long_name="H.264/AVC/MPEG-4 AVC/MPEG-4 part 10" profile="Constrained Baseline" codec_type="video" codec_time_base="1/60" codec_tag_string="avc1" codec_tag="0x31637661" width="560" height="320" coded_width="560" coded_height="320" has_b_frames="0" sample_aspect_ratio="0:1" display_aspect_ratio="0:1" pix_fmt="yuv420p" level="30" color_range="tv" color_space="bt709" color_transfer="bt709" color_primaries="bt709" chroma_location="left" refs="1" is_avc="true" nal_length_size="4" r_frame_rate="30/1" avg_frame_rate="30/1" time_base="1/90000" start_pts="0" start_time="0.000000" duration_ts="498000" duration="5.533333" bit_rate="465641" bits_per_raw_sample="8" nb_frames="166"> 
     <disposition default="1" dub="0" original="0" comment="0" lyrics="0" karaoke="0" forced="0" hearing_impaired="0" visual_impaired="0" clean_effects="0" attached_pic="0" timed_thumbnails="0"/> 
     <tag key="creation_time" value="2010-03-20T21:29:11.000000Z"/> 
     <tag key="language" value="und"/> 
     <tag key="encoder" value="JVT/AVC Coding"/> 
    </stream> 
    <stream>...</stream> 
    </streams> 
    <format filename="/Users/andre/Projects/qnap/librarian/librarian/data/movie.mp4" nb_streams="2" nb_programs="0" format_name="mov,mp4,m4a,3gp,3g2,mj2" format_long_name="QuickTime/MOV" start_time="0.000000" duration="5.568000" size="383631" bit_rate="551193" probe_score="100"> 
    <tag key="major_brand" value="mp42"/> 
    <tag key="minor_version" value="0"/> 
    <tag key="compatible_brands" value="mp42isomavc1"/> 
    <tag key="creation_time" value="2010-03-20T21:29:11.000000Z"/> 
    <tag key="encoder" value="HandBrake 0.9.4 2009112300"/> 
    </format> 
</ffprobe> 
+0

आपका एक्सएमएल पार्सिंग मेरे लिए काम नहीं करता है (डेबियन 9, पायथन 3.5.3, एफएफप्रोब 3.2.8-1 ~ deb9u1)। लेकिन संकेत के लिए धन्यवाद हालांकि: मैंने JSON का उपयोग करने के लिए अपना कोड बदल दिया और यह काम कर रहा है। –

+0

प्रतिक्रिया के लिए धन्यवाद। क्या आप कृपया बता सकते हैं कि यह आपके लिए क्यों काम नहीं करता है? क्या यह एक पायथन मुद्दा है या जेनरेट एक्सएमएल अनुरूप नहीं है? –

+0

जब मैं आपके फ़ंक्शन को कॉल करता हूं तो रिटर्न स्टेटमेंट मुझे 'एट्रिब्यूट एरर: मॉड्यूल' xml.etree 'में कोई विशेषता नहीं देता है' ElementTree ' –