फ़ाइल आकार रखने के लिए FFMPEG के लिए इष्टतम पैरामीटर


0

इसलिए विचार यह है: मैं every.single.video में कनवर्ट करना चाहता हूं मेरे पास 1 टेराबाइट ड्राइव में एक प्रारूप है जो मेरा क्रोमकास्ट खेल सकता है ( https://developers.google.com/cast/docs/media ) और मैं ख़ुशी से अपने नए पीसी को कुछ दिनों (सप्ताह?) के लिए काम नहीं कर रहा हूँ। महान, FFMPEG मोक्ष के लिए।

थोड़ी सी पृष्ठभूमि: मैं एक Android / Java डेवलपर हूं (StackOverflow में बहुत सक्रिय) और मुझे पता है कि मुझे कुछ बैच स्क्रिप्ट, या क्विक जावा कमांड लाइन कोड करने की आवश्यकता होगी (क्योंकि मैं जावा के साथ अधिक आरामदायक हूं ) नौकरी करने के लिए, लेकिन मुझे अभी भी यकीन नहीं है कि मेरे FFMPEG कमांड लाइन में कौन से तर्क का उपयोग करना है।

तो मेरी जरूरतें हैं: - वीडियो कोडेक: H.264 हाई प्रोफाइल लेवल 5 - ऑडियो कोडेक: HE-AAC, LC-AAC, MP3 में से कोई भी (ईमानदारी से भगवान को मैं अंतर नहीं जानता, शायद कुछ बेहतर होगा?) रखें? - मैं निश्चित रूप से धीमी या धीमी (बेहतर गुणवत्ता के लिए) का उपयोग करना चाहता हूं - मैं निश्चित रूप से चर बिटरेट (बेहतर गुणवत्ता के लिए) के साथ 2-पास का उपयोग करना चाहता हूं

उपरोक्त सभी मैंने ट्यूटोरियल और मैनुअल पर देखा कि कैसे प्राप्त किया जाए, अब वह हिस्सा जिसे मैं वास्तव में पूरा नहीं कर पा रहा हूं:

मैं चाहता हूं कि अंतिम फ़ाइल का आकार लगभग मूल के समान हो। ऐसा इसलिए है क्योंकि ड्राइव लगभग 80% पूर्ण है और मैं इसे केवल सामान परिवर्तित करके नहीं भरना चाहता। स्क्रिप्ट पर मैं फ़ाइल को फिर से एन्कोड करूंगा और चीजों के लिए मूल को हटा दूंगा, बिना मुद्दों के चलते रहेंगे।

तो मैं कैसे पटकथा में डाल करने के लिए video_bitrate और Audio_bitrate फ़ाइलों से मिलता है?

पीएस: मैं हैंडब्रेक का उपयोग करने पर उतना ही खुश हूं अगर कोई जानता है कि एक ही काम कैसे पूरा किया जाए।

मदद के लिए अग्रिम धन्यवाद।

जवाबों:


2

Ffmpeg कमांड जो आपको चाहिए वह कुछ इस तरह है:

ffmpeg -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -an -pass 1 output.bar;
ffmpeg -y -i input.foo -c:v libx264 -profile:v high -level 5 -preset slow -b:v $videobitrate -b:a $audiobitrate -pass 2 output.bar

libx264 h264 एनकोडर है, और सभी विकल्प ffmpeg से पास हो जाते हैं, वे काफी आत्म व्याख्या हैं। पहले पास के लिए ऑडियो की जरूरत नहीं है, इसलिए एक -an। यदि आप चाहें तो आउटपुट / देव / नल को पाइप कर सकते हैं, लेकिन जो भी हो। मैं सिर्फ दूसरे पास में -y स्विच का उपयोग करता हूं ताकि यह बिना पूछे टेम्प फाइल को ओवरराइट कर दे। डिफ़ॉल्ट रूप से ऑडियो कोडेक aac है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है।

ffprobe आप $ videobitrate और $ audiobitrate का मूल्य प्राप्त करने में मदद कर सकते हैं (मैं एक सकारात्मक वातावरण मान रहा हूं, अन्यथा यह% videobitrate% और% audiobitrate% होने जा रहा है)। मूल्यों को एक ऐसे रूप में प्राप्त करने के लिए आपको कुछ sed, awk या perl voodoo करने होंगे, जिनका आप उपयोग कर सकते हैं। यहाँ मेरी मशीन पर एक यादृच्छिक mp4 पर ffprobe का उत्पादन है:

ffprobe version 2.1.3 Copyright (c) 2007-2013 the FFmpeg developers
  built on Feb 12 2014 22:10:38 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libtheora --enable-libvorbis --enable-libvpx --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-aacenc --enable-libass --enable-ffplay --enable-libspeex --enable-libschroedinger --enable-libfdk-aac --enable-openssl --enable-libopus --enable-frei0r --enable-libcaca --enable-libopenjpeg --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1/include/openjpeg-1.5 '
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'loop.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.19.104
  Duration: 00:00:19.56, start: 0.000000, bitrate: 201 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x226 [SAR 226:225 DAR 16:9], 129 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 75 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

झुंझलाहट ffprobe सब कुछ डंप करने के लिए stderr, तो आप इसे stdout को पुनर्निर्देशित करने की जरूरत है। मैं आपको नहीं बताऊंगा कि अंडे कैसे चूसें, आपका सेड-फू मेरा से बेहतर हो सकता है, लेकिन इसके लिए जो देर में आए , उदाहरण के लिए पूरे शेबंग के लिए बिटरेट प्राप्त करने के लिए ऊपर आप कुछ ऐसा कर सकते हैं:

videobitrate=$(ffprobe input.foo 2>&1|grep bitrate |sed "s/.*bitrate: \([0-9]*\) \([km]*\).*/\1\2/")

और ऑडियो के लिए:

audiobitrate=$(ffprobe input.foo 2>&1|grep Audio|sed "s/.* \([0-9]*\) \([km]*\)b\/s.*/\1\2/")

निश्चित नहीं है कि ऑडियो का बिटरेट क्यों निर्दिष्ट किया गया था, लेकिन वीडियो का नहीं, इसलिए हो सकता है क्योंकि मैं आमतौर पर एक स्थिर दर कारक (निरंतर बिटरेट के बजाय स्थिर गुणवत्ता) के साथ संपीड़ित करता हूं। आपको अपनी फिल्मों पर ffprobe आउटपुट की जांच करनी होगी। वहां से यह आपके ऊपर है कि आपको किन चरों की जरूरत है। ध्यान दें कि ffmpeg 100k या 3m जैसी संख्याओं को पार्स करेगा।


मैंने पूरे उत्तर को पढ़ा और संसाधित भी नहीं किया था, लेकिन मैंने पहले से ही इसे पूरा करने के लिए समय और प्रयास के लिए उत्थान किया। मैं इस छोटे प्रोजेक्ट पर इस या अगले सप्ताहांत में खुदाई करूँगा और हम देखेंगे कि यह कैसे जाता है। आपका बहुत बहुत धन्यवाद! निष्ठा से!
Budius

मेरे पास कुछ प्रश्न हैं: 1) तो यह मूल बिटरेट की प्रतिलिपि है और सामान का अंत में एक ही आकार होना चाहिए? मैं ईमानदारी से कुछ और अधिक जटिल उम्मीद करता हूं, यह जानकर खुशी हुई कि नहीं। 2) यदि यह इतना आसान है, तो FFMPEG पर कोई विकल्प नहीं है जो "same_bitrate" कहता है? 3) क्या प्रथम-पास बिटरेट अंतिम पास की तुलना में अधिक नहीं है? एक बार फिर धन्यवाद।
Budius

अच्छी तरह से आकार = x लंबाई बिटरेट, हां, वे एक ही फ़ाइल आकार होगा। हालांकि, बिटरेट वास्तव में मुख्य चिंता का विषय नहीं है, यह गुणवत्ता है जो मायने रखता है। जटिल कारक यह है कि गुणवत्ता संपीड़न की दक्षता, साथ ही सामग्री की प्रकृति पर निर्भर है। यदि मूल कम कुशल कोडेक के साथ एन्कोड किए गए हैं - उदाहरण के लिए यदि वे मानक परिभाषा MPEG2 वीडियो (जैसे कि आप डीवीडी पर प्राप्त करेंगे) लगभग 5 एमबी / सेकेंड पर एन्कोडेड हैं, तो समान गुणवत्ता वाली प्रतियों के लिए आवश्यक स्थान h264 के साथ एन्कोडेड होगा बहुत छोटा; 1Mb / s इसे कर सकता है।
stib

... इसका परीक्षण किए बिना इसे जज करने का कोई आसान तरीका नहीं है, लेकिन एक बेहतर तरीका है, जो बिटरेट पर ध्यान केंद्रित करने के बजाय निरंतर गुणवत्ता पर एनकोड करना है। Ffmpeg libx264 निरंतर गुणवत्ता सेटिंग को -crf के साथ लागू किया जाता है (लगातार दर कारक के लिए खड़ा है, जो भी इसका मतलब है)। एक पूर्णांक मान गुणवत्ता को निर्धारित करता है, दोषरहित के लिए 1 पर शुरू होता है, और बकवास के लिए लगभग 31 तक स्केलिंग करता है। डीवीडी के समान गुणवत्ता पर एन्कोड करने के लिए आप -rf 20 का उपयोग करेंगे।
stib

ओह, और फिर से: दो पास बात। दो पास मूल रूप से इसका मतलब है कि यह फुटेज के माध्यम से यह निर्धारित करने के लिए जाता है कि वास्तव में एन्कोडिंग करने से पहले उन हिस्सों को जहां सबसे अधिक बिटरेट की आवश्यकता होती है। यह तब तदनुसार उपलब्ध बिटरेट को विभाजित कर सकता है। इसलिए यदि आपको स्टैटिक शॉट मिला है जिसमें ज्यादा एक्शन नहीं है तो यह चेस सीन की तुलना में कम b / s का उपयोग करेगा। आप देखेंगे कि यह एक लॉग फ़ाइल का उत्पादन करेगा, यह वही है जो बिटरेट को निर्धारित करने के लिए उपयोग किया जाता है।
stib
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.