ฉันจะใช้การเข้ารหัส CRF กับ nvenc ใน ffmpeg ได้อย่างไร


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

ฉันลองใช้ nvenc กับ NVIDIA GTX1070 ของฉัน:

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⨉หรือ5⨉ขนาดเดิม - nvenc -crfไม่ได้ใช้

ดังนั้นฉันจะใช้ nvenc กับ ffmpeg เพื่อแปลง / ปรับขนาดวิดีโอที่มีคุณภาพสูงและขนาดเล็กได้อย่างไร ฉันควรใช้ GPU เพื่อเข้ารหัสหรือไม่


คุณสามารถเปลี่ยนslowไปfastอยู่ในคำสั่งแรกของคุณ CRF nvencไม่ได้ดำเนินการใน
Gyan

เป้าหมายของ NVENC คือการอนุญาตให้มีการเข้ารหัสวิดีโอแบบเรียลไทม์ (สำหรับสิ่งต่าง ๆ เช่นแฮงเอาท์วิดีโอ); คุณภาพคือการพิจารณาผู้ใต้บังคับบัญชา
CL

คำตอบ:


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 นั้นจะแย่ที่สุดแน่นอน

สามารถปรับปรุงคุณภาพเพิ่มเติมได้โดยการเพิ่มตัวเลือกเช่นB-frames (จำกัด สิ่งนี้ไว้ที่ 3 มากที่สุดและต้องใช้โปรไฟล์ H.264 หลักขึ้นไปส่วนกำหนดค่าพื้นฐานไม่รองรับ B-frames เมื่อต้องการทำสิ่งนี้ให้ส่งผ่าน-bf {uint}ไปที่ ตัวเข้ารหัสวิดีโอซึ่ง-bf:v 4จะส่งผลให้ตัวเข้ารหัสใช้ 4 B-frames

ส่วนสำคัญของที่นี่คือ-cq:v 19และ-rc:v vbr_hqอาร์กิวเมนต์ที่ให้คุณปรับแต่งตัวเข้ารหัสด้วยบิตเรตตัวแปรที่ตั้งไว้และบิตเรตที่อนุญาตสูงสุด ( -b:vและ-maxrate:v) ในขณะที่ปฏิบัติตามค่า CRF ที่ 19

และในตอนนี้โน้ตเล็ก ๆ เกี่ยวกับ NVENC และทำการปรับแต่งเพื่อเข้ารหัสคุณภาพสูง:

NVENC เช่นตัวเข้ารหัสฮาร์ดแวร์อื่น ๆ มีข้อ จำกัด หลายประการและโดยเฉพาะอย่างยิ่งกับ HEVC นี่คือข้อ จำกัด ที่ทราบ:

  1. บน Pascal:

    สำหรับการเข้ารหัส HEVC จะมีข้อ จำกัด ดังต่อไปนี้:

    • ไม่รองรับขนาด CTU ที่สูงกว่า 32
    • ไม่รองรับ B-frames ใน HEVC
    • รูปแบบพื้นผิวที่สนับสนุนโดยตัวเข้ารหัส NVENC จำกัด ช่องว่างสีที่ตัวเข้ารหัสสามารถทำงาน สำหรับตอนนี้เรามีการสนับสนุน 4: 2: 0 (8 บิต) และ 4: 4: 4 (สำหรับ 10 บิต) ไม่รองรับรูปแบบที่ไม่เกี่ยวข้องเช่น 4: 2: 2 10 บิต สิ่งนี้จะส่งผลกระทบต่อเวิร์กโฟลว์ที่จำเป็นต้องใช้ colorpaces ดังกล่าว
    • การควบคุมการดูล่วงหน้ายัง จำกัด อยู่ที่ 32 เฟรม คุณอาจต้องการดูรายละเอียดเพิ่มเติมจากบรรณาธิการนี้

ทัวริงมีการปรับปรุงทั้งหมดที่มีให้สำหรับ Pascal ด้วยการเพิ่มการสนับสนุนเฟรม B สำหรับ HEVC และความสามารถในการใช้เฟรม B เป็นข้อมูลอ้างอิง ดูคำตอบนี้สำหรับตัวอย่างเกี่ยวกับความสามารถนี้

  1. และบน Maxwell Gen 2 (GPU ชุด GM200x):

    การเข้ารหัส HEVC ขาดคุณสมบัติต่อไปนี้:

    • ตัวอย่างความสามารถของตัวกรองลูปAdaptive Offset (SAO)
    • การปรับ quantization
    • การควบคุมอัตราการดูล่วงหน้า

ผลกระทบที่นี่สำหรับ Maxwell คือฉากการเคลื่อนไหวที่หนักด้วย HEVC ภายใต้บิตเรตที่ จำกัด อาจได้รับผลกระทบจากการประดิษฐ์ (blockiness) เนื่องจากฟังก์ชั่น lookahead ที่ขาดหายไปและความสามารถในการกรองลูปตัวอย่าง Pascal มีการปรับปรุงความสามารถนี้ค่อนข้างมาก แต่ขึ้นอยู่กับรุ่นของ SDK ที่ตัวเข้ารหัสวิดีโอสร้างขึ้นด้วยคุณสมบัติบางอย่างอาจไม่สามารถใช้ได้

ตัวอย่างเช่นโหมดการทำนายแบบถ่วงน้ำหนักสำหรับการเข้ารหัส H.264 บน Pascal ต้องใช้ NVENC SDK 8.0x และสูงกว่าและโหมดการเข้ารหัสนี้จะปิดใช้งานการสนับสนุน B-frame ด้วย ในทำนองเดียวกันการรวมกันของผู้ค้าส่งฮาร์ดแวร์ที่ใช้งาน Nvidia Performance Primitives (NPP) กับ NVENC อาจแนะนำการปรับปรุงประสิทธิภาพด้วยแอปพลิเคชันการปรับขนาดวิดีโอที่ค่าใช้จ่ายของการปรับขนาดการประดิษฐ์โดยเฉพาะอย่างยิ่งเนื้อหาที่อัปสเกล เช่นเดียวกันก็ส่งผลต่อไพพ์ไลน์การเข้ารหัสวิดีโอเนื่องจากฟังก์ชันการปรับขนาดของ NPP วิ่งออกจากแกน CUDA บน GPU และดังนั้นผลกระทบด้านประสิทธิภาพที่แนะนำโดยการโหลดเพิ่มเติมควรได้รับการวิเคราะห์เป็นกรณี ๆ ไปเพื่อพิจารณาว่าคุณภาพการทำงานหรือไม่ การแลกเปลี่ยนเป็นที่ยอมรับ

โปรดจำไว้ว่า: ตัวเข้ารหัสที่ใช้ฮาร์ดแวร์จะให้การปรับแต่งที่ค่อนข้างน้อยกว่าการปรับใช้ซอฟต์แวร์ที่เทียบเท่าและด้วยเหตุนี้ระยะทางและคุณภาพผลผลิตที่ยอมรับได้ของคุณจะแตกต่างกันเสมอ

และสำหรับการอ้างอิงของคุณ:

ด้วย 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

ตัวอย่างผลลัพธ์ใน testbed ของฉัน:

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
คำตอบที่ดี! ffmpeg wiki บน nvenc นั้นล้าสมัยเล็กน้อยและขาดข้อมูลทั้งหมดนั้น…หากคุณมีเวลาไม่กี่นาทีมันจะดีมากถ้าคุณสามารถมีส่วนร่วมในความรู้ของคุณที่นั่น: trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
ขอบคุณสำหรับคำตอบ :) ffmpeg wiki ต้องการคำตอบเพิ่มเติมเช่นนี้
hongducwb

ขอบคุณสำหรับความคิดเห็น. ฉันจะดูการเพิ่มสิ่งนี้ใน FFmpeg wiki
2560

เอาท์พุทไฟล์สีดูเหมือนเข้มผมจำได้ว่าหนึ่งในข้อโต้แย้งสามารถควบคุมสีเดียวกับแฟ้มใส่
hongducwb

2
vbr_minqpดูเหมือนว่าจะเลิกใช้แล้วในขณะนี้ h264_nvencชนิดของการยอมรับว่าคำตอบนี้อาจจะเข้าใจผิดว่าเป็นไม่มีโหมดสำหรับ CRF
slhck

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ตัวเลือกนี้จะทำงานเฉพาะในขณะที่มีการตั้งค่า-rcconstqp


1
ไม่เป็นทุกที่แตกต่างจาก-qp h264_nvenc 's เทียบเท่ากับlibx264 ' s-crf-qp-qp
Meow

@ Meow ใกล้พอสำหรับฉัน แต่มันก็ดีที่จะรู้ว่ามันมีความแตกต่าง สำหรับทุกคนที่อาจเห็นสิ่งนี้ในอนาคตหน้านี้จะอธิบายความแตกต่างระหว่าง CRF และ QP
Alexander01998

3

สำหรับ-crfการเปลี่ยนจาก libx264 อาจจะเป็น-cqหรือ-qpจาก h264_nvenc:

-crf เลือกคุณภาพสำหรับโหมดคุณภาพคงที่

-cq ตั้งค่าระดับคุณภาพเป้าหมาย (0 ถึง 51, 0 หมายถึงอัตโนมัติ) สำหรับโหมดคุณภาพคงที่ในการควบคุมอัตรา VBR

-qp วิธีการควบคุมอัตราพารามิเตอร์ quantization คงที่ (จาก -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ความละเอียดในการป้อนข้อมูล (ในฮาร์ดแวร์); ไม่จำเป็นต้องรวบรวม ffmpeg --enable-libnppสำหรับscale_nppตัวกรอง

สำหรับข้อมูลเพิ่มเติม:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.