2015-06-01 8 views
7

मैं दूरस्थ सर्वर पर संग्रहीत मीडिया फ़ाइलों का विश्लेषण करने के लिए ffprobe का उपयोग कर रहा हूं। ऐसा लगता है कि यह अच्छी तरह से काम करता है, लेकिन कुछ फ़ाइलों के लिए अवधि गुम या गलत है (आमतौर पर यह होने से अधिक लंबा)। अन्य बार यह इस जानकारी को सटीक रूप से लौटाता है, और ऐसा लगता है कि यह मीडिया प्रकार (कोडेक, आदि) से संबंधित प्रतीत नहीं होता है।एफएफप्रोब अवधि निर्धारित करता है?

ffprobe -v quiet -print_format json -show_streams -show_format "http://host.com/file.wav"

कौन इस परिणाम उत्पन्न करता है:

ffprobe -v quiet -print_format json -show_streams -show_format http://host.com/file.aiff

{ 
"streams": [ 
    { 
     "index": 0, 
     "codec_name": "pcm_s16be", 
     "codec_long_name": "PCM signed 16-bit big-endian", 
     "codec_type": "audio", 
     "codec_time_base": "1/44100", 
     "codec_tag_string": "[0][0][0][0]", 
     "codec_tag": "0x0000", 
     "sample_fmt": "s16", 
     "sample_rate": "44100", 
     "channels": 2, 
     "bits_per_sample": 16, 
     "r_frame_rate": "0/0", 
     "avg_frame_rate": "0/0", 
     "time_base": "1/44100", 
     "start_pts": 0, 
     "start_time": "0.000000", 
     "duration_ts": 8494248, 
     "duration": "192.613333", 
     "bit_rate": "1411200", 
     "nb_frames": "8494248", 
     "disposition": { 
      "default": 0, 
      "dub": 0, 
      "original": 0, 
      "comment": 0, 
      "lyrics": 0, 
      "karaoke": 0, 
      "forced": 0, 
      "hearing_impaired": 0, 
      "visual_impaired": 0, 
      "clean_effects": 0, 
      "attached_pic": 0 
     } 
    } 
], 
"format": { 
    "filename": "http://host.com/file.aiff", 
    "nb_streams": 1, 
    "nb_programs": 0, 
    "format_name": "aiff", 
    "format_long_name": "Audio IFF", 
    "start_time": "0.000000", 
    "duration": "192.613333", 
    "probe_score": 100 
} 
} 

यहाँ एक का एक उदाहरण है कि ऐसा नहीं करता है:

यहाँ एक आदेश का एक उदाहरण है कि काम करता है

{ 
"streams": [ 
    { 
     "index": 0, 
     "codec_name": "pcm_s16le", 
     "codec_long_name": "PCM signed 16-bit little-endian", 
     "codec_type": "audio", 
     "codec_time_base": "1/44100", 
     "codec_tag_string": "[1][0][0][0]", 
     "codec_tag": "0x0001", 
     "sample_fmt": "s16", 
     "sample_rate": "44100", 
     "channels": 2, 
     "bits_per_sample": 16, 
     "r_frame_rate": "0/0", 
     "avg_frame_rate": "0/0", 
     "time_base": "1/44100", 
     "bit_rate": "1411200", 
     "disposition": { 
      "default": 0, 
      "dub": 0, 
      "original": 0, 
      "comment": 0, 
      "lyrics": 0, 
      "karaoke": 0, 
      "forced": 0, 
      "hearing_impaired": 0, 
      "visual_impaired": 0, 
      "clean_effects": 0, 
      "attached_pic": 0 
     } 
    } 
], 
"format": { 
    "filename": "http://host.com/file.wav", 
    "nb_streams": 1, 
    "nb_programs": 0, 
    "format_name": "wav", 
    "format_long_name": "WAV/WAVE (Waveform Audio)", 
    "bit_rate": "1411200", 
    "probe_score": 99 
} 
} 

ये दो उदाहरण अलग-अलग प्रारूप हैं, लेकिन मैंने इसे देखा है और प्रारूप समान होने पर काम नहीं करता है, मेरे पास एक उदाहरण आसान नहीं है।

मैं क्या जानना चाहता हूं कि अगर मैं ffprobe के साथ उपयोग कर रहे पैरामीटर के बारे में कुछ बदल सकता हूं, तो अवधि को लगातार और सटीक निर्धारित करने की अनुमति देने के लिए, या कोई भी जानकारी जो मैं पा सकता हूं कि ffprobe कैसे काम करता है तो मैं समझता हूं कि मैं इनपुट फ़ाइलों को कैसे बदल सकता हूं, आदि ताकि वे सही तरीके से काम कर सकें।

वैकल्पिक रूप से, यदि कोई अलग उपकरण है जो अधिक विश्वसनीय रूप से काम करता है (इसे ओपन-सोर्स लिनक्स टूल होना आवश्यक है) तो कोई सुझाव या सिफारिशों का स्वागत है।

+1

शायद सबसे सटीक तरीका फ़ाइल को पूरी तरह से डीकोड करना होगा, फिर कंसोल आउटपुट देखें: 'ffmpeg -i input -f null -'। दुर्भाग्यवश यह आपके इनपुट के आधार पर कुछ समय ले सकता है। – LordNeckbeard

+0

मैंने सोचा था कि एफएफएमपीजी ने कंटेनर का उपयोग अवधि की गणना करने के लिए किया था (मूल रूप से जो भी मेटाडेटा कंटेनर में था ... पर भरोसा करते हुए ...)? – rogerdpack

+0

@LordNeckbeard ffmpeg ट्रांसकोडिंग प्रक्रिया पूरी होने के बाद एक सटीक अवधि प्रदान करता है, लेकिन मेरे आवेदन के लिए मैं क्लाइंट को वापस लौटने से पहले परिणाम को स्टोर करने का जोखिम नहीं उठा सकता (या वैकल्पिक रूप से, ट्रांसकोडिंग ऑपरेशन को दो बार चलाने का समय) । – jasongullickson

उत्तर

3

एक सरल उपाय -show_packets विकल्प

ffprobe -i input.mp4 -show_packets > a.txt 

अब खुला a.txt का उपयोग करें और पिछले पैकेट के पास जाकर dts_time मूल्य उस फ़ाइल की सही अवधि होगा देखने के लिए है। यदि dts_time परिभाषित नहीं किया गया है तो pts_time मान के लिए जांच करें।

संबंधित मुद्दे