मैं ffmpeg में nvenc के साथ CRF एन्कोडिंग का उपयोग कैसे कर सकता हूं?


23

वीडियो (1080p) को 2GB से 300MB तक आकार देने के लिए यह मेरी वर्तमान कमांड है, लेकिन इसमें बहुत समय लगता है:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

मैंने अपने NVIDIA GTX1070 के साथ nvenc की कोशिश की:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

आउटपुट आकार हमेशा 3 size या 5⨉ मूल आकार होता है - एनवीकेएन का उपयोग नहीं होता है -crf

तो मैं उच्च गुणवत्ता और छोटे आकार के साथ वीडियो को बदलने / आकार बदलने के लिए ffmpeg के साथ nvenc का उपयोग कैसे करूं? क्या मुझे एन्कोडिंग के लिए GPU का उपयोग करना चाहिए?


आप बदल सकते हैं slowकरने के लिए fastअपने पहले आदेश में। सीआरएफ में लागू नहीं है nvenc
ज्ञान

NVENC का लक्ष्य वास्तविक समय वीडियो एन्कोडिंग (वीडियो कॉल जैसी चीजों के लिए) की अनुमति देना है; गुणवत्ता एक अधीनस्थ विचार है।
सीएल।

जवाबों:


24

CRF- आधारित एन्कोड के लिए, FFmpeg के नीचे स्निपेट में निम्न तर्क दें:

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

बेशक, आपको लक्ष्य बिट दर और निश्चित cqमूल्य के लिए समायोजित करने की आवश्यकता होगी । 19 इसकी '0 के समान दृष्टिगत रूप से अनुशंसित सेटिंग है, फिर भी फ़ाइल आकार के लिए अच्छे संपीड़न व्यापार को संरक्षित करता है। CRF क्या करता है, इसके बारे में अधिक जानने के लिए यह लिखें।

ध्यान दें कि -cqस्केल लॉगरिदमिक है, जिसका अर्थ है कि 0 अनिवार्य रूप से दोषरहित है और 51 सबसे खराब होगा।

बी-फ्रेम जैसे विकल्पों को जोड़कर गुणवत्ता में और सुधार किया जा सकता है (इसे अधिकतम 3 तक सीमित करें, और इसके लिए H.264 मुख्य प्रोफ़ाइल और इसके बाद के संस्करण की आवश्यकता है। बेसलाइन प्रोफाइल बी-फ्रेम का समर्थन नहीं करते हैं। ऐसा करने के लिए, पास -bf {uint}करें। वीडियो एनकोडर, -bf:v 44 बी-फ्रेम का उपयोग करके एनकोडर में परिणाम होगा।

यहाँ मुख्य भाग हैं -cq:v 19और -rc:v vbr_hqतर्क, जो आपको 19 के CRF मान का पालन करते हुए पूर्व निर्धारित चर बिटरेट और अधिकतम स्वीकार्य बिट्रेट ( -b:vऔर -maxrate:v) दोनों के साथ एनकोडर को ट्यून करने की अनुमति देते हैं ।

और अब, NVENC के बारे में छोटे नोट, और उच्च गुणवत्ता वाले एनकोड के लिए इसे ट्यूनिंग:

NVENC, किसी भी अन्य हार्डवेयर-आधारित एनकोडर की तरह, कई सीमाएँ हैं, और विशेष रूप से HEVC के साथ, यहाँ ज्ञात सीमाएँ हैं:

  1. पास्कल पर:

    HEVC एनकोड के लिए, निम्नलिखित सीमाएँ लागू होती हैं:

    • 32 से ऊपर के CTU आकार समर्थित नहीं हैं।
    • HEVC में बी-फ्रेम भी समर्थित नहीं हैं।
    • NVENC एनकोडर द्वारा समर्थित बनावट प्रारूप उन रंग स्थानों को सीमित करता है जो एनकोडर के साथ काम कर सकते हैं। अभी के लिए, हमारे पास 4: 2: 0 (8-बिट) और 4: 4: 4 (10-बिट के लिए) का समर्थन है। बाहरी प्रारूप जैसे 4: 2: 2 10-बिट समर्थित नहीं हैं। यह कुछ वर्कफ़्लोज़ को प्रभावित करेगा जहाँ ऐसे रंगों की आवश्यकता होती है।
    • देखो आगे नियंत्रण भी 32 तख्ते तक सीमित है। आप अधिक विवरण के लिए इस संपादकीय को देखना चाह सकते हैं ।

ट्यूरिंग में एचएवीसी के लिए बी-फ्रेम समर्थन और एक संदर्भ के रूप में बी-फ्रेम का उपयोग करने की क्षमता के साथ, पास्कल के लिए सभी संवर्द्धन उपलब्ध हैं। इस क्षमता पर एक उदाहरण के लिए इस उत्तर को देखें ।

  1. और मैक्सवेल जनरल 2 (GM200x श्रृंखला जीपीयू) पर:

    HEVC एन्कोडिंग में निम्नलिखित विशेषताओं का अभाव है:

मैक्सवेल के लिए यहाँ प्रभाव यह है कि विवश बिटरेट्स के तहत HEVC के साथ मोशन हैवी दृश्य लुक्सहेड फ़ंक्शंस और अनुकूली नमूना ऑफ़सेट (SAO) लूप फ़िल्टरिंग क्षमताओं के कारण विरूपण साक्ष्य (ब्लॉकनेस) से पीड़ित हो सकते हैं। पास्कल इस क्षमता में कुछ हद तक सुधार हुआ है, लेकिन एसडीके के संस्करण के आधार पर कि वीडियो एनकोडर के साथ बनाया गया था, सभी सुविधाएं उपलब्ध नहीं हो सकती हैं।

उदाहरण के लिए, Pascal पर H.264 एन्कोड के लिए भारित भविष्यवाणी मोड में NVENC SDK 8.0x और इसके बाद के संस्करण की आवश्यकता होती है, और यह एन्कोड मोड बी-फ्रेम समर्थन को भी अक्षम कर देगा। इसी तरह, एनवीईएनसी के साथ एनवीडिया परफॉर्मेंस प्राइमेटीविटी (एनपीपी) से चलने वाले हार्डवेयर-आधारित स्केलर्स के संयोजन में स्केलिंग कलाकृतियों की कीमत पर वीडियो स्केलिंग अनुप्रयोगों के साथ प्रदर्शन में सुधार हो सकता है, खासकर अपग्रेडेड सामग्री के साथ। यह भी वीडियो एनकोड पाइपलाइन को प्रभावित करता है क्योंकि एनपीपी के स्केलिंग फ़ंक्शन GPU पर CUDA कोर से चलते हैं, और इस तरह, अतिरिक्त लोड द्वारा प्रस्तुत प्रदर्शन प्रभाव का विश्लेषण केस-बेस केस पर किया जाना चाहिए ताकि यह निर्धारित किया जा सके कि प्रदर्शन-गुणवत्ता व्यापार बंद स्वीकार्य है।

इसे ध्यान में रखें: एक हार्डवेयर-आधारित एनकोडर हमेशा समतुल्य सॉफ़्टवेयर-आधारित कार्यान्वयन की तुलना में कुछ हद तक कम अनुकूलन की पेशकश करेगा, और इस तरह, आपका माइलेज और स्वीकार्य आउटपुट गुणवत्ता हमेशा भिन्न होगी।

और आपके संदर्भ के लिए:

FFmpeg के साथ, आप हमेशा अनुकूलन के लिए एक एनकोडर की सेटिंग्स को संदर्भित कर सकते हैं:

ffmpeg -h encoder {encoder-name}

तो, NVENC- आधारित एन्कोडर के लिए, आप चला सकते हैं:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

आप सभी NVENC- आधारित एन्कोडर और NPP- आधारित स्केलर (यदि ऐसा बनाया गया है) चलाकर भी देख सकते हैं:

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

मेरे परीक्षण पर नमूना उत्पादन:

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion

1
बहुत बढ़िया जवाब! Nvenc पर ffmpeg wiki थोड़ी पुरानी है और इसमें सभी जानकारी का अभाव है ... यदि आपके पास कुछ मिनट हैं, तो बहुत अच्छा होगा यदि आप अपने ज्ञान का योगदान दे सकें: trac.ffmpeg.org/wiki/HWAccelIroro
slhck

1
उत्तर के लिए धन्यवाद :) ffmpeg wiki को इस तरह के अधिक उत्तर की आवश्यकता है
hongducwb

प्रतिक्रिया के लिए धन्यवाद। मैं इसे FFmpeg विकि से जोड़कर देखूँगा।

आउटपुट रंग फ़ाइलें गहरे रंग की तरह लगती हैं, मुझे याद है कि एक तर्क इनपुट फ़ाइल के समान रंग को नियंत्रित कर सकता है
hongducwb

2
vbr_minqpलगता है अब पदावनत कर दिया जाएगा। इस बात से सहमत हैं कि इस जवाब को गलत समझा जा सकता है क्योंकि इसमें सीआरएफ मोड नहीं है h264_nvenc
19

4

मेरा मानना ​​है कि मुझे एक समाधान मिला:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

ऐसा लगता है कि h264_nvenc -qpइसके बजाय का उपयोग करता है -crf। यह विकल्प केवल उसी समय पर काम करता है जब -rcइसे सेट किया जाता है constqp


1
नहीं, -qpहर अलग है -crfh264_nvenc के -qpके बराबर है libx264 s '-qp
म्याऊ

@ मेरे लिए यह काफी करीब है, लेकिन यह जानना अच्छा है कि इसमें अंतर है। भविष्य में जो कोई भी इसे देख सकता है, उसके लिए यह पृष्ठ सीआरएफ और क्यूपी के बीच के अंतर को बताता है।
अलेक्जेंडर

3

के लिए -crflibx264 से प्रतिस्थापन हो सकता है -cqया -qph264_nvenc से:

-crf निरंतर गुणवत्ता मोड के लिए गुणवत्ता का चयन करें

-cq VBR दर नियंत्रण में निरंतर गुणवत्ता मोड के लिए लक्ष्य गुणवत्ता स्तर (0 से 51, 0 का मतलब स्वचालित) सेट करें

-qp लगातार परिमाणीकरण पैरामीटर दर नियंत्रण विधि (-1 से 51 तक) (डिफ़ॉल्ट -1)

सबसे तेजी से हार्डवेयर त्वरित सांकेतिक शब्दों में बदलना विधि:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizeइनपुट पर समाधान (हार्डवेयर में); फ़िल्टर के --enable-libnppलिए संकलित करने के लिए ffmpeg की कोई आवश्यकता नहीं है scale_npp

अधिक जानकारी के लिए:

ffmpeg -h encoder=h264_nvenc

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