बिना गुणवत्ता हानि के साथ x265 (HEVC) में वीडियो लाइब्रेरी को पुनः एन्कोडिंग


43

मैं स्पेस पाने के लिए अपनी वीडियो लाइब्रेरी को HEVC फॉर्मेट में बदलने की कोशिश कर रहा हूं। मैंने अपनी लाइब्रेरी में सभी वीडियो फ़ाइलों पर निम्न कमांड चलाई:

#!/bin/bash
for i in *.mp4;
do 
    #Output new files by prepending "X265" to the names
    avconv -i "$i" -c:v libx265 -c:a copy X265_"$i"
done

अब, अधिकांश वीडियो ठीक हैं और गुणवत्ता पहले की तरह ही है। हालाँकि, कुछ वीडियो जो बहुत उच्च गुणवत्ता के हैं (जैसे एक मूवी प्रिंट जो 5GB का है) गुणवत्ता खो देता है - वीडियो सभी पिक्सेलित है।

मुझे यकीन नहीं है कि इस मामले में क्या करना है। क्या मुझे crfअपनी कमांड लाइन में पैरामीटर को संशोधित करने की आवश्यकता है ? या कुछ और?

बात यह है, मैं एक थोक रूपांतरण कर रहा हूँ। इसलिए, मुझे एक ऐसी विधि की आवश्यकता है जहां avconvप्रत्येक वीडियो के लिए जो भी पैरामीटर समायोजन की आवश्यकता हो, उसे स्वचालित रूप से समायोजित करता है।

अद्यतन-1

मैंने पाया कि crfवह घुंडी है जिसे मुझे समायोजित करने की आवश्यकता है। डिफ़ॉल्ट CRF 28 है। बेहतर गुणवत्ता के लिए, मैं 28 से कम कुछ का उपयोग कर सकता हूं। उदाहरण के लिए:

avconv -i input.mp4 -c:v libx265 -x265-params crf=23 -c:a copy output.mp4

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

अद्यतन-2

मैंने पाया कि --losslessx265 में एक विकल्प है: http://x265.readthedocs.org/en/default/liveless.html

हालाँकि, मुझे नहीं पता कि इसका सही उपयोग कैसे किया जाए। मैंने निम्नलिखित तरीके से इसका उपयोग करने की कोशिश की, लेकिन इसके विपरीत परिणाम मिले (वीडियो को और भी अधिक पिक्सेलित किया गया):

avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4

1
--losslessवास्तव में फ़ाइल का विस्तार हो सकता है, अगर यह पहले के हानिपूर्ण कोडेक को डिकोड करता है और फिर इसे खो देता है जो इसे दोषरहित रूप से डिकोड करता है। गुणवत्ता इनपुट के समान ही रहेगी।
गोल्लर रामबालर

2
यदि आपके स्रोत हानिरहित (जो सबसे अधिक संभावना है) में एन्कोडेड हैं, तो आप जो हासिल करने की कोशिश कर रहे हैं वह असंभव है। कोई भी ट्रांसकोडिंग जो दोषरहित नहीं है, गुणवत्ता को और भी गिरा देगा (भले ही आपको तुरंत दिखाई न दे) और यदि आप दोषरहित से दोषरहित में परिवर्तित हो जाते हैं, तो आपको बड़े फ़ाइल आकार मिलेंगे।
सर्ज बोर्श

जवाबों:


58

मेरे अपने अनुभव से, यदि आप गुणवत्ता में कोई कमी नहीं चाहते हैं, तो - बिना किसी कारण के आप देख रहे हैं।

के बारे में निश्चित नहीं है, avconvलेकिन आपके द्वारा लिखी गई कमांड मेरे साथ क्या करती है, इसके समान है FFmpeg। में FFmpegआप इस तरह पैरामीटर पारित कर सकते हैं:

ffmpeg -i INPUT.mkv -c:v libx265 -preset ultrafast -x265-params lossless=1 OUTPUT.mkv

अधिकांश x265स्विच (बिना मूल्य वाले विकल्प) इस तरह निर्दिष्ट किए जा सकते हैं (उन सीएलआई-केवल लोगों को छोड़कर, जिनका उपयोग केवल x265बाइनरी के साथ सीधे किया जाता है )।

उस रास्ते से, मैं x265एन्कोडिंग के साथ अपना अनुभव साझा करना चाहता हूं । अधिकांश वीडियो के लिए (यह WMV, या MPEG, या AVC / H.264 हो) मैं उपयोग करता हूं crf=23x265बाकी मापदंडों को तय करता है और आमतौर पर यह एक अच्छा काम करता है।

हालाँकि अक्सर इससे पहले कि मैं किसी वीडियो को उसकी संपूर्णता में बदलने के लिए प्रतिबद्ध हूं, मैं वीडियो में एक छोटे से हिस्से को परिवर्तित करके अपनी सेटिंग्स का परीक्षण करता हूं। यहाँ एक उदाहरण है, मान लें कि एक mkv फ़ाइल है जिसमें स्ट्रीम 0 वीडियो है, धारा 1 डीटीएस ऑडियो है, और धारा 2 एक उपशीर्षक है:

ffmpeg -hide_banner \
-ss 0 \
-i "INPUT.mkv" \
-attach "COVER.jpg" \
-map_metadata 0 \
-map_chapters 0 \
-metadata title="TITLE" \
-map 0:0 -metadata:s:v:0 language=eng \
-map 0:1 -metadata:s:a:0 language=eng -metadata:s:a:0 title="Surround 5.1 (DTS)" \
-map 0:2 -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:t:0 filename="Cover.jpg" -metadata:s:t:0 mimetype="image/jpeg" \
-c:v libx265 -preset ultrafast -x265-params \
crf=22:qcomp=0.8:aq-mode=1:aq_strength=1.0:qg-size=16:psy-rd=0.7:psy-rdoq=5.0:rdoq-level=1:merange=44 \
-c:a copy \
-c:s copy \
-t 120 \
"OUTPUT.HEVC.DTS.Sample.mkv"

ध्यान दें कि बैकस्लैश सिग्नल लाइन एक लंबी कमांड में टूटती है, मैं इसे एक जटिल सीएलआई इनपुट के विभिन्न बिट्स का ट्रैक रखने में मेरी मदद करने के लिए करता हूं। इससे पहले कि मैं इसे लाइन-बाय-लाइन समझाऊं, वह हिस्सा जहां आप केवल एक वीडियो का एक छोटा सा हिस्सा कन्वर्ट करते हैं, दूसरी लाइन और दूसरी आखिरी लाइन: -ss 0इसका मतलब है कि इनपुट को डिकोड करना शुरू करने से पहले 0 सेकंड की तलाश करें, और -t 120आउटपुट के लिए लिखना बंद करें 120 सेकंड के बाद। आप hh: mm: ss या hh: mm: ss.sss टाइम फॉर्मेट का भी उपयोग कर सकते हैं।

अब लाइन-बाय-लाइन:

  1. -hide_bannerFFmpegप्रारंभ पर बिल्ड जानकारी दिखाने से रोकता है। जब मैं कंसोल में स्क्रॉल करता हूं तो मैं इसे देखना चाहता हूं;
  2. -ss 0इनपुट को डीकोड करने से पहले 0 सेकंड का प्रयास करता है। ध्यान दें कि यदि यह पैरामीटर इनपुट फ़ाइल के बाद और आउटपुट फ़ाइल से पहले दिया जाता है, तो यह आउटपुट विकल्प बन जाता है ffmpegऔर एक्स सेकंड तक इनपुट को डीकोड और अनदेखा करने के लिए कहता है, और फिर आउटपुट पर लिखना शुरू करता है। इनपुट विकल्प के रूप में यह कम सटीक है (क्योंकि अधिकांश कंटेनर स्वरूपों में मांग सटीक नहीं है), लेकिन लगभग कोई समय नहीं लगता है। एक आउटपुट विकल्प के रूप में यह बहुत सटीक है, लेकिन निर्दिष्ट समय से पहले सभी स्ट्रीम को डीकोड करने में काफी समय लगता है, और परीक्षण के उद्देश्य के लिए आप समय बर्बाद नहीं करना चाहते हैं;
  3. -i "INPUT.mkv": इनपुट फ़ाइल निर्दिष्ट करें;
  4. -attach "COVER.jpg": आउटपुट में एक कवर आर्ट (थंबनेल चित्र, पोस्टर, जो भी हो) संलग्न करें। कवर आर्ट आमतौर पर फ़ाइल खोजकर्ताओं में दिखाया जाता है;
  5. -map_metadata 0: किसी भी और सभी मेटाडेटा पर इनपुट 0 से कॉपी करें, जो उदाहरण में सिर्फ इनपुट है;
  6. -map_chapters 0: इनपुट से अध्याय की जानकारी (यदि मौजूद है) पर कॉपी;
  7. -metadata title="TITLE": वीडियो का शीर्षक सेट करें;
  8. -map 0:0 ...: इनपुट ० का मैप स्ट्रीम ०, जिसका अर्थ है कि हम इनपुट से पहला स्ट्रीम आउटपुट पर लिखना चाहते हैं। चूंकि यह स्ट्रीम एक वीडियो स्ट्रीम है , इसलिए यह आउटपुट में पहला वीडियो स्ट्रीम है , इसलिए स्ट्रीम निर्दिष्ट करता है । इसका भाषा टैग अंग्रेजी में सेट करें;:s:v:0
  9. -map 0:1 ...: पंक्ति 8 के समान, दूसरी स्ट्रीम (DTS ऑडियो) को मैप करें, और इसकी भाषा और शीर्षक (खिलाड़ियों से चयन करते समय आसान पहचान के लिए) सेट करें;
  10. -map 0:2 ...: पंक्ति 9 के समान, इस धारा को छोड़कर एक उपशीर्षक है;
  11. -metadata:s:t:0 ...: कवर कला के लिए मेटाडेटा सेट करें। यह mkv कंटेनर प्रारूप के लिए आवश्यक है;
  12. -c:v libx265 ...: वीडियो कोडेक विकल्प। यह इतना लंबा है कि मैंने इसे दो लाइनों में तोड़ दिया है। यह सेटिंग उच्च गुणवत्ता वाले धुंधला वीडियो (1080p) के लिए ढाल में न्यूनतम बैंडिंग के साथ अच्छा है (जो x265 पर बेकार है)। यह डीवीडी और टीवी शो और फोन वीडियो के लिए सबसे अधिक संभावना है। यह सेटिंग ज्यादातर इस Doom9 पोस्ट से चुराई गई है ;
  13. crf=22:...: वीडियो कोडेक मापदंडों की निरंतरता। ऊपर उल्लिखित फोरम पोस्ट देखें;
  14. -c:a copy: ऑडियो पर कॉपी;
  15. -c:s copy: उपशीर्षक पर प्रतिलिपि;
  16. -t 120: 120 सेकंड के बाद आउटपुट पर लिखना बंद करें, जो हमें ट्रांसकोडिंग गुणवत्ता का पूर्वावलोकन करने के लिए 2 मिनट की क्लिप देता है;
  17. "OUTPUT.HEVC.DTS.Sample.mkv": आउटपुट फ़ाइल नाम। मैं वीडियो कोडेक और प्राथमिक ऑडियो कोडेक के साथ अपनी फ़ाइल नाम टैग करता हूं।

वाह। यह मेरा पहला उत्तर है इसलिए यदि कोई चीज छूट गई है तो कृपया टिप्पणी छोड़ दें। मैं एक वीडियो प्रोडक्शन विशेषज्ञ नहीं हूं, मैं सिर्फ एक लड़का हूं जो खिलाड़ी को डिस्क डालकर फिल्म देखने के लिए बहुत आलसी है।

पुनश्च। हो सकता है कि यह सवाल कहीं और का है क्योंकि यह यूनिक्स और लिनक्स से दृढ़ता से संबंधित नहीं है।


2
ठीक वही जो मेरे द्वारा खोजा जा रहा था! विकल्पों का अच्छा कवरेज। क्या आपको पता है कि अगर c:s copyकोई सबटाइटल सामग्री नहीं है तो ffmpeg पर क्या होगा?
एल्डर गीक

1
@ElderGeek नहीं, ffmpeg तभी कुछ कहेगा जब उस विकल्प का कोई प्रभाव होगा।
यिफेंग मु

क्या यह विकल्प सही मायने में losless h265 एन्कोडिंग के लिए सबसे छोटी संभव फ़ाइल आकार उत्पन्न करता है? यदि नहीं, तो क्या मैं ऐसा कर सकता हूं?
बफ़र ओवर पढ़ें

1
@BitByte मुझे नहीं लगता कि h265 में दोषरहित संपीड़न स्तर है। संपीड़न-कम विकल्प के लिए, यह बस है --lossless। मैंने h264 से h265 तक दोषरहित रूपांतरण के लिए व्यर्थ में खोजा, और जो मैंने सीखा है वह बताता है कि यह गणितीय रूप से असंभव है।
यिफेंग म्यू

1
आपको वास्तव --losslessमें इस उत्तर के स्विच से युक्त कमांड को संपादित करना चाहिए , क्योंकि इस प्रश्न के उत्तर के रूप में वहाँ रखा गया है ऐसा लगता है जैसे आप कह रहे हैं कि यह दोषरहित संपीड़न है, जो भ्रामक है।
हाशिम

8

मैं हाल ही में HEVC पर अपनी पूरी वीडियो कैटलॉग ट्रांसकोडिंग की परेशानी से गुजरा हूं। मैं निम्न सेटिंग्स के साथ https://github.com/FallingSnow/h265ize का उपयोग करता हूं ।

h265ize -v -m मध्यम -q 20 -x --no-sao --aq-mode 3 --delete -stats

-v - वर्बोज़ आउटपुट
-म माध्यम - मध्यम एनकोड स्पीड (छोटी उच्च गुणवत्ता, कुछ भी जो मुझे धीमा लगता है वह समय / गुणवत्ता के अंतर के लायक नहीं है)
-q 20 - CRF का उपयोग किया जाता है, २० x264 में १ 18 या तो के समान है, लेकिन हे। यह 1080p सामग्री (मेरे टीवी का 90%) के लिए है, मैं अपनी 4K फिल्मों के लिए 22 का उपयोग करता हूं
-x - x265 केंद्रीय परिभाषित आदेशों का उपयोग करें - कोई
-कोई नमूना एडाप्टिव ऑफसेट को बंद करता है (एनकोड की गति में सुधार)
--aq- मोड 3 - ऑटो विचरण के साथ अनुकूली मात्रा का उपयोग करें, विशेष रूप से अंधेरे क्षेत्रों में 8 बिट एन्कोड करने में मदद करता है, अधिकांश बैंडिंग को रोक सकता है जो कि (एन्कोड समय के खर्च पर) हो
सकता है - फिर भी - एन्कोडिंग फ़ाइल के साथ एन्कोडिंग फ़ाइल को बदलें (इस का उपयोग करके परीक्षण करें) )
--stats - आपके द्वारा चलाए गए पथ की जड़ में एक सीएसवी फ़ाइल के आंकड़े लिखें।

एनकोड स्पीड मेरी रिग पर लगभग 30fps (अधिकांश 1080p सामान के लिए) है। दोहरी XEON E5 2687W v2, लेकिन मैं FFMPEG प्रक्रिया को किसी एक प्रोसेसर के पहले पक्ष का उपयोग नहीं करने के लिए मजबूर करता हूं (यह मेरा Plex सर्वर है, इसलिए यह सुनिश्चित करना है कि प्लेबैक आदि की आवश्यकता होने पर ट्रांसकोड के लिए ओवरहेड हो)

हाँ, इसमें से अधिकांश को बदलने में थोड़ा समय लगा, और अब मेरे पास एक निर्धारित कार्य है जो उस दिन से x265 तक सामान को एनकोड करने के लिए दिन में दो बार चलता है।

अंतरिक्ष की बचत बहुत हुई है। मेरा प्रारंभिक SAN 20Tb उपयोग में था, अब यह लगभग 12 है, लेकिन जाहिर है इसमें 6 महीने अधिक सामग्री भी जोड़ी गई है।

मैंने अपनी सभी फ़िल्मों को भी ट्रांसकोड करना शुरू कर दिया है, हालाँकि, यह एक सतत प्रक्रिया है, क्योंकि मुझे गुणवत्ता के स्तर को पहचानना है (रैडिक सौभाग्य से लेबल) और तीन ट्रांसकोड सेटिंग्स में से एक का उपयोग करें:

-m slower -q 18 -x --no-sao --aq-mode 3
-m medium -q 20 -x --no-sao --aq-mode 31080p के लिए 720p ट्रांसकोड
-m medium -q 22 -x --no-sao2160 पी के लिए

आशा है कि कुछ लोगों की मदद करता है। चिल्लाओ अगर किसी को एक हाथ की जरूरत है यह सब स्थापित। और इससे पहले कि आप सब कुछ x265 में एनकोड करें, प्लेबैक के बारे में सोचें, यदि क्लाइंट x265 मूल का समर्थन नहीं करता है, तो सीपीसी और गुणवत्ता के मामले में ट्रांसकेड महंगा हो सकता है।


साथ x265 2.4 और बाद में (नई लैम्ब्डा तालिकाओं के साथ , साओ आमतौर पर बिटरेट प्रति गुणवत्ता के लिए एक अच्छी बात है कि दे तेज encodes)। यह अभी भी थोड़ा धीमा है, लेकिन इसके लायक होने के लिए पर्याप्त अन्य कलाकृतियों को कम करता है।
पीटर कॉर्ड्स

-q 20CRF 20 नहीं है, यह निरंतर QP रेटकंट्रोल है । डिफ़ॉल्ट और अनुशंसित मोड, सीआरएफ, उच्च जटिलता वाले दृश्यों में क्यूपी को बढ़ाता है, इसलिए यह उन दृश्यों पर बहुत अधिक बिट खर्च नहीं करता है जिन्हें एन्कोड करना बहुत कठिन है। (यदि आप समान QP के करीब चाहते हैं, qcompतो डिफ़ॉल्ट 0.6 से 0.7 या 0.8 तक बढ़ा सकते हैं। 1.0 से क्लोज़र CQP के करीब है।)
पीटर कॉर्ड्स

3

Ffmpeg में x265 एनकोडर के लिए दोषरहित मोड को सक्षम करने के लिए सही सिंटैक्स है -x265-params lossless=1(आपको संलग्न करने की आवश्यकता है =1)।

हालांकि, दोषरहित कोडिंग के लिए बेहतर कोडेक विकल्प हैं। मैंने परीक्षण करके पाया कि FFV1 कम से कम कुछ प्रकार के वीडियो पर (यदि दोनों कोडेक के लिए सर्वोत्तम सेटिंग्स चुनी जाती हैं) तो कम से कम बेहतर (फ़ाइल आकार = ~ x265 का 80%) संपीड़ित करता है। और यह तेजी से काम भी करता है, और (AFAIK) पेटेंट से मुग्ध नहीं है। यही है, यह वीडियो संग्रह के लिए हर तरह से दोषरहित H.265 से बेहतर है।

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