FFmpeg निकालने की क्लिप - धारा फ्रेम दर कंटेनर फ्रेम दर (x264, aac) से भिन्न होती है


8

सारांश
H.264 वीडियो में वास्तव में उच्च फ्रेम दर है जो वीडियो की अवधि के लिए लागू करने के लिए स्केलिंग कारक की आवश्यकता होती है जिसे मैं निकालने की कोशिश कर रहा हूं (900x निचला)।

बॉडी
मैं एक फिल्म से क्लिप निकालने की कोशिश कर रहा हूं जो मेरे पास MP4 प्रारूप में है ( हैंडब्रेक का उपयोग करके बनाई गई )। Mencoder और VLC की कोशिश करने के बाद, मैंने FFmpeg को एक शॉट देने का फैसला किया क्योंकि यह कोडेक्स की नकल करने के बाद कम से कम परेशानी वाला था। यही कारण है कि, mencoder और VLC की तुलना में, परिणामस्वरूप फ़ाइल अभी भी QuickTime में खेलने योग्य थी (मैं पेरियन के बारे में जानता हूं, आदि, मैं बस यह जानने की कोशिश कर रहा हूं कि यह सब कैसे काम करता है)।

वैसे भी, मेरी आज्ञा इस प्रकार थी:

ffmpeg -ss 01:15:51 -t 00:05:59 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

प्रतिलिपि के दौरान, निम्नलिखित आता है:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from outofsight.mp4':
  Duration: 01:57:42.10, start: 0.000000, bitrate: 830 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x384, 25 tbr, 22500 tbn, 45k tbc
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16
Output #0, mp4, to 'out.mp4':
    Stream #0.0(und): Video: libx264, yuv420p, 720x384, q=2-31, 90k tbn, 22500 tbc
    Stream #0.1(eng): Audio: libfaac, 48000 Hz, stereo, s16
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press [q] to stop encoding
frame= 2591 fps=2349 q=-1.0 size=    8144kB time=101.60 bitrate= 656.7kbits/s
…

5:59 अवधि क्लिप के बजाय, मुझे फिल्म के बाकी हिस्से मिलते हैं। तो, यह परीक्षण करने के लिए, मैं ffmpeg कमांड के साथ भाग गया -t 00:00:01। मुझे जो मिला वह ठीक 15:00 मिनट की क्लिप थी। इसलिए मैंने कुछ ब्लैक बॉक्स इंजीनियरिंग की और अपना -tविकल्प देने का फैसला किया , जिसमें यह दर्ज करने के लिए क्या मूल्य दिया गया कि 1 सेकंड की व्याख्या 900 s के रूप में की गई। मेरी इच्छित 359 क्लिप के लिए, मैंने 0.399 s की गणना की और इसलिए मेरा ffmpeg कमांड बन गया:

ffmpeg -ss 01:15.51 -t 00:00:00.399 -i outofsight.mp4 \ 
-acodec copy -vcodec copy clip.mp4

यह काम करता है, लेकिन मुझे पता नहीं है कि अवधि को 900 से कम क्यों बढ़ाया गया है। आगे की जांच करते हुए, प्रत्येक ffmpeg रन में लाइन है:

Seems stream 0 codec frame rate differs from container frame rate: 45000.00 (45000/1) -> 25.00 (25/1)

45000/25 = 1800. कहीं न कहीं एक रिश्ता होना चाहिए। किसी भी तरह, अस्पष्ट रूप से उच्च फ्रेम दर समय के साथ समस्या पैदा कर रहा है। फ्रेम दर इतनी अधिक कैसे है? इसके बारे में सबसे अच्छी बात यह है कि परिणामी क्लिप .mp4 में ठीक वैसी ही विशेषता है (कॉपी किए गए वीडियो कोडेक के कारण), और इससे आगे की क्लिप लेने के लिए -tअवधि विकल्प के लिए समान स्केलिंग की आवश्यकता होती है। इसलिए, मैंने इसे किसी भी व्यक्ति के लिए उपलब्ध कराया है जो इसे जांचना चाहता है।

परिशिष्ट
मेरे सिस्टम पर ffmpeg के लिए प्रस्तावना (MacPorts ffmpeg पोर्ट का उपयोग करके निर्मित):

FFmpeg version 0.5, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --prefix=/opt/local --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-avfilter --enable-avfilter-lavf --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libdirac --enable-libschroedinger --enable-libfaac --enable-libfaad --enable-libxvid --enable-libx264 --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/gcc-4.2 --arch=x86_64
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    1. 4. 0 /  1. 4. 0
  libswscale     1. 7. 1 /  1. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Jan  4 2010 21:51:51, gcc: 4.2.1 (Apple Inc. build 5646) (dot 1)

EDIT
सुनिश्चित नहीं है कि यह एक बग था या नहीं, लेकिन यह अभी ffmpeg के मेरे वर्तमान संस्करण में तय किया गया प्रतीत होता है, कम से कम इस वीडियो के लिए (MacPorts से संस्करण 0.6.1)।


पुन: एन्कोडिंग एक समाधान नहीं है और सामग्री के पांच मिनट के लिए डिकोडिंग के लायक घंटे करना अनुचित है और संभवतः अंतर्निहित मुद्दे को संबोधित नहीं करेगा। महान प्रारंभिक अनुसंधान btw। आप यह मानने में सही हैं कि एफपीएस एफएमपीपी आपकी समस्या की जड़ है। यह ffmpeg के बाद के संस्करण जैसा लगता है कि आपकी समस्या तय हो गई है लेकिन मैं एक टिप्पणी करूंगा। मैं एक अलग कंटेनर प्रारूप के लिए एक प्रतिलिपि प्रतिलिपि करने की सिफारिश की है। इससे कई तरह के प्रभाव पड़ सकते हैं लेकिन यह प्रयोग करने का एक अच्छा अगला कदम होगा।
dstob

जवाबों:


1

Ffmpeg के साथ, विकल्पों की स्थिति मायने रखती है। आपके उदाहरण के साथ, यह इनपुट पर -t और -t लागू करने का प्रयास कर रहा है। इसे इस तरह उपयोग करें कि इसके बजाय आउटपुट पर विकल्प लागू होंगे:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -acodec copy -vcodec copy clip.mp4

वर्तमान ffmpeg के साथ, सही सिंटैक्स होगा:

ffmpeg -i outofsight.mp4 -ss 01:15:51 -t 00:05:59 -c copy clip.mp4

1

मुझे यही समस्या हो रही थी और मेरा समाधान निम्नलिखित था:

        $ffmpegout = array();           
        //10 is the number of images you want from video
        $fracduration = ($info['duration']/10);             

exec ('ffmpeg -y -i /testmedia/'.ininfo ['filename'] > & 1 ', $ ffmpegout); // print_r ($ ffmpegout);

यह मुझे सभी वीडियो के लिए 10 छवियां देता है, चाहे वीडियो की लंबाई कोई भी हो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.