c मैं किसी भी h264 फ़ाइल की अवधि कैसे जान सकता हूँ?




ffmpeg h.264 (3)

मेरे पास एक फाइल है जिसमें केवल एच 264 फ्रेम एनएएल इकाई के रूप में हैं तो अब क्या कोई तरीका है, इसलिए मैं उस फाइल की अवधि गिन सकता हूं?

मैं नहीं जानता कि फाइल में कितने फ़्रेम हैं I मेरे पास केवल फ़ाइल आकार है

पुनश्च: मैं जो करना चाहता हूं, वह सी भाषा में है और लिनक्स मंच पर है।


आपका सवाल बेकार है, इसलिए किसी ने आपको वोट डाला है।

कंटेनर फ़ाइल

सबसे पहले, H264 file रूप में ऐसी कोई बात नहीं है। एक कंटेनर फ़ाइल (एमपी 4, एवीआई, एमकेवी) हो सकती है जो एच 264 एन्कोडेड वीडियो रखती है। उस कंटेनर प्रारूप में आमतौर पर डेटा को आपके पास वीडियो अवधि शामिल बताता है। तो आपको उस फ़ाइल को पार्स करना होगा, यह देखने के लिए प्रारूप दस्तावेज़ीकरण की जांच करें कि अवधि कहाँ बचाई गई है, और उसके बाद इसे निकालें।

सबसे आसान तरीका है एफ् एफएमपीईजी का उपयोग करना जैसे अगस्तो ने सुझाव दिया

एनएएल बाइट स्ट्रीम

यदि आपकी फ़ाइल केवल एनएएल इकाइयों को एक के बाद एक बचा है, जैसे कि एनएएल बाइट स्ट्रीम में, वहाँ कोई रास्ता नहीं है कि आप वीडियो अवधि प्राप्त कर सकते हैं! चूंकि एच 264 एन्कोडेड चित्र समय की जानकारी नहीं रखता है

अगर ऐसा मामला है, तो आप फिर भी एक सन्निकटन कर सकते हैं यदि आप वीडियो एफपीएस जानते हैं ... आपको फ़ाइल को छोड़कर सभी फ़्रेमों को गिनना चाहिए:

  • अनुक्रम पैरामीटर समूह
  • चित्र पैरामीटर समूह
  • धारा का अंत
  • अनुक्रम का अंत
  • डेटा फ़िल्टर करें
  • एक्सेस यूनिट डिलीमीटर

और फिर गणित करें: NUMBER_OF_FRAMES / FPS = DURATION_IN_SECONDS

आरटीपी स्ट्रीम

यदि आप गलत हैं और प्रत्येक एनएएल इकाई के शीर्ष पर आरटीपी हेडर हैं, तो आप प्रत्येक आरटीपी शीर्षलेख के आरटीपी समय को चेक करके आसानी से वीडियो अवधि प्राप्त कर सकते हैं। आरटीपी हेडर में बाइट्स का मतलब क्या है, आप यहां यहां पता लगा सकते हैं: http://www.networksorcery.com/enp/protocol/rtp.htm आप प्रत्येक एक से TIMESTAMP भाग (4 बाइट पूर्णांक) प्राप्त करना चाहते हैं। कोड ऐसा करना चाहिए:

int last_timestamp = GetNextTimestamp();
double duration_in_ms = 0;

while(true)
{
    int next = GetNextTimestamp();
    duration_in_ms += (next - last_timestamp)/90000.0;
    last_timestamp = next;
}

अवधि प्राप्त करने का गंदे तरीका, जो कई, कई devs का उपयोग करते हैं, फ़ाइल से जानकारी प्राप्त करने के लिए ffmpeg को चलाने के लिए, और stdout पर क्या ffmpeg प्रिंट करता है। मुझे पता है कि यह आदर्श नहीं है, लेकिन यह काम करता है।

यदि आप ffmpeg -i Sintel.2010.1080p.mkv (आप यहां से ffmpeg -i Sintel.2010.1080p.mkv डाउनलोड कर सकते हैं ) चलाते हैं, आउटपुट लाइनों में से एक है Duration: 00:14:48.03, start: 0.000000, bitrate: 640 kb/s आप लाइन को पार्स कर सकते हैं और अवधि निकाल सकते हैं।

हो सकता है कि आप सी एफ फ़ैमिली से सी फंक्शन पर सीधे फोन करके एक ही जानकारी प्राप्त कर सकें, लेकिन यह मेरे ज्ञान से बाहर है।


h.264 में समय जानकारी शामिल है

कच्चे annexb h.264 डेटा कुछ रूप में (स्मृति या फ़ाइल) में कुछ "अनुक्रम पैरामीटर सेट" या एसपीएस फ़्रेम होंगे। इनमें आमतौर पर समय की जानकारी होगी, विशेष रूप से "टाइम_स्केल" और "num_units_in_tick" ज्यादातर परिदृश्यों में फ़्रेम दर तय होती है जो एसपीएस में "fixed_frame_rate_flag" द्वारा निर्दिष्ट की जाती है। प्रत्येक फ्रेम के लिए अवधि 2 * num_units_in_tick / time_scale (2 == 1 + nuit_field_based_flag) होगी। फ्रेम्स को आम तौर पर "एक्सेस यूनिट डिलीमीटर" से अलग किया जाता है

फ्रेम की अवधि की संख्या फ्रेम की अवधि आपको कुल अवधि देगा







video-codecs