2013-09-27 9 views
5

पर बहुत तेजी से खेलती हैं मैं एक libavformat एपीआई रैपर पर काम कर रहा हूं जो MP4 फ़ाइलों को H.264 और एएसी के साथ स्ट्रीमिंग के लिए उपयुक्त एमपीईजी-टीएस सेगमेंट में परिवर्तित करता है। मैं फिर से एन्कोडिंग के बिना एक साधारण स्ट्रीम कॉपी कर रहा हूं, लेकिन मेरे द्वारा उत्पादित फाइलें 24 एफपीएस की बजाय वीडियो को 3600 एफपीएस पर वापस चलाती हैं।एफएफएमपीजी के libavformat एपीआई का उपयोग कर एक सीधी स्ट्रीम कॉपी के साथ बनाई गई फ़ाइलें 3600 एफपीएस

यहाँ ffprobe https://gist.github.com/chrisballinger/6733678 से कुछ आउटपुट हैं, टूटी हुई फ़ाइल के नीचे है:

r_frame_rate=1/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=0 
start_time=0.000000 
duration_ts=2999 
duration=0.033322 

मैन्युअल ffmpeg के माध्यम से भेजा एक ही इनपुट फ़ाइल उचित टाइमस्टैम्प जानकारी है: मेरा मानना ​​है कि

r_frame_rate=24/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=126000 
start_time=1.400000 
duration_ts=449850 
duration=4.998333 

समस्या झूठ libavformat के मेरे सेटअप में कहीं भी: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349 जहां मैंने ffmpeg.c से कोड का एक गुच्छा repurposed जो प्रत्यक्ष स्ट्रीम प्रति के लिए आवश्यक था।

चूंकि 3600 "जादू संख्या" (60 * 60) जैसा लगता है, यह उतना आसान हो सकता है जितना कि मैं समय पैमाने को ठीक से सेट नहीं कर रहा हूं, लेकिन मुझे यह पता नहीं लगाया जा सकता है कि मेरा कोड ffmpeg/avconv से अलग हो जाता है।

इसी प्रकार के प्रश्न यहाँ है, लेकिन मुझे नहीं लगता कि वे जहाँ तक मिल गया के रूप में मैंने किया था: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

उत्तर

1

यह कुछ समय लिया, लेकिन इस जवाब है: https://stackoverflow.com/a/16903982/805882

packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base); 
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base); 
2

वास्तव में अपने अंक और डीटीएस अव्यवस्थित हैं।

एमपी 4 फ़ाइल में एमपी 4 टाइमबेस के अनुसार अंक और डीटीएस हैं और आप टीएस मक्सर को उसी पीटीएस और डीटीएस पास कर रहे हैं जो 90000 हर्ट्ज घड़ी के साथ काम करता है। उदाहरण के लिए यदि आपका एफपीएस प्रति सेकंड 30 फ्रेम है तो टीएस में इसका मतलब यह होगा कि प्रत्येक 3000 टिकों पर एक वीडियो फ्रेम दिखाएं।

आपको mp4 से ts timbase में pts को बदलने के लिए av_rescal_q का उपयोग करना चाहिए।

+0

धन्यवाद! मुझे पूरा यकीन नहीं था कि समय आधार को सही तरीके से कैसे पुन: सहेजना है, लेकिन ऐसा लगता है कि यह मुझे सही दिशा में इंगित करने में मदद कर सकता है। मैं आपको बता दूंगा कि यह कैसे चला जाता है! –

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