เข้ารหัสไลบรารีวิดีโออีกครั้งใน 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จะปรับพารามิเตอร์ใด ๆ ที่จำเป็นต้องปรับโดยอัตโนมัติสำหรับวิดีโอแต่ละรายการ

UPDATE-1

ฉันพบว่าcrfเป็นปุ่มที่ฉันต้องปรับ CRF เริ่มต้นคือ 28 เพื่อคุณภาพที่ดีกว่าฉันสามารถใช้บางอย่างน้อยกว่า 28 ตัวอย่างเช่น:

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

อย่างไรก็ตามปัญหาคือสำหรับวิดีโอ CRF ค่า 28 นั้นดีพอสำหรับบางวิดีโอ CRF ที่ต่ำกว่านั้นต้องการ นี่คือสิ่งที่ฉันต้องตรวจสอบด้วยตนเองโดยแปลงส่วนเล็ก ๆ ของวิดีโอขนาดใหญ่ แต่ในการแปลงจำนวนมากฉันจะตรวจสอบวิดีโอแต่ละรายการด้วยตนเองได้อย่างไร เป็นวิธีที่avconvสามารถปรับ CRF ตามวิดีโออินพุตอย่างชาญฉลาดหรือไม่?

UPDATE-2

ผมพบว่ามี--losslessตัวเลือกใน x265: http://x265.readthedocs.org/en/default/lossless.html

อย่างไรก็ตามฉันไม่ทราบวิธีการใช้อย่างถูกต้อง ฉันลองใช้มันในลักษณะดังต่อไปนี้ แต่ให้ผลลัพธ์ที่ตรงข้าม (วิดีโอเป็นพิกเซลมากขึ้น)

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

1
--losslessในความเป็นจริงอาจขยายไฟล์ถ้ามันถอดรหัสตัวแปลงสัญญาณที่สูญหายก่อนหน้านี้และจากนั้นเข้ารหัสสิ่งที่มันได้ถอดรหัส losslessly คุณภาพจะอยู่ในระดับเดียวกันกับอินพุต
Golar Ramblar

2
หากแหล่งที่มาของคุณถูกเข้ารหัสด้วยความสูญเสีย (ซึ่งเป็นไปได้มากที่สุด) สิ่งที่คุณพยายามจะบรรลุนั้นเป็นไปไม่ได้ การแปลงรหัสใด ๆ ที่ไม่ใช่แบบไม่สูญเสียจะทำให้คุณภาพลดลงไปอีก (แม้ว่าคุณจะมองไม่เห็นในทันที) และหากคุณแปลงจากความสูญเสียเป็นความสูญเสียคุณจะได้รับขนาดไฟล์ใหญ่ขึ้น
Sarge Borsch

คำตอบ:


58

จากประสบการณ์ของฉันเองถ้าคุณต้องการคุณภาพอย่างไม่มีการสูญเสีย - ไม่มีสิ่งใดที่คุณกำลังมองหา

ไม่แน่ใจเรื่องแต่คำสั่งที่คุณพิมพ์ลักษณ์ที่เหมือนกันกับสิ่งที่ฉันจะทำอย่างไรกับavconv FFmpegในFFmpegคุณสามารถส่งผ่านพารามิเตอร์เช่นนี้:

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

x265สวิทช์ส่วนใหญ่(ตัวเลือกที่ไม่มีค่า) สามารถระบุได้เช่นนี้ (ยกเว้นสวิตช์ CLI-only ที่ใช้กับx265ไบนารีโดยตรงเท่านั้น)

ด้วยวิธีนี้ฉันต้องการแบ่งปันประสบการณ์ของฉันกับการx265เข้ารหัส สำหรับวิดีโอมากที่สุด (ไม่ว่าจะเป็น WMV, หรือ MPEG หรือ AVC / H.264) crf=23ผมใช้ x265ตัดสินใจเลือกพารามิเตอร์ที่เหลือและโดยปกติจะทำงานได้ดีพอ

อย่างไรก็ตามบ่อยครั้งก่อนที่ฉันจะแปลงรหัสวิดีโอให้ครบถ้วนฉันจะทดสอบการตั้งค่าของฉันด้วยการแปลงวิดีโอส่วนเล็ก ๆ ที่เป็นปัญหา นี่คือตัวอย่างสมมติว่าไฟล์ mkv ที่มีสตรีม 0 เป็นวิดีโอสตรีม 1 เป็นเสียง DTS และสตรีม 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"

โปรดทราบว่าแบ็กสแลชสายสัญญาณแบ่งในคำสั่งยาวฉันทำเพื่อช่วยในการติดตามบิตต่างๆของอินพุต CLI ที่ซับซ้อน ก่อนที่ฉันจะอธิบายทีละบรรทัดส่วนที่คุณแปลงเพียงส่วนเล็ก ๆ ของวิดีโอคือบรรทัดที่สองและบรรทัดที่สอง: -ss 0หมายถึงการค้นหา 0 วินาทีก่อนที่จะเริ่มถอดรหัสอินพุตและ-t 120หมายถึงหยุดเขียนไปยังเอาต์พุต หลังจาก 120 วินาที คุณยังสามารถใช้รูปแบบเวลา hh: mm: ss หรือ hh: mm: ss.sss

ตอนนี้ทีละบรรทัด:

  1. -hide_bannerป้องกันFFmpegจากการแสดงข้อมูลการสร้างเมื่อเริ่มต้น ฉันแค่ไม่อยากเห็นมันเมื่อฉันเลื่อนขึ้นในคอนโซล;
  2. -ss 0พยายาม 0 วินาทีก่อนที่จะเริ่มการถอดรหัสอินพุต โปรดทราบว่าหากพารามิเตอร์นี้ได้รับหลังจากอินพุตไฟล์และก่อนไฟล์เอาต์พุตมันจะกลายเป็นตัวเลือกเอาต์พุตและบอกffmpegให้ถอดรหัสและละเว้นอินพุตจนถึง x วินาทีจากนั้นเริ่มเขียนไปยังเอาต์พุต ในฐานะที่เป็นตัวเลือกอินพุตมันมีความแม่นยำน้อยกว่า (เนื่องจากการค้นหาไม่ถูกต้องในรูปแบบคอนเทนเนอร์ส่วนใหญ่) แต่ใช้เวลาไม่นาน เป็นตัวเลือกเอาต์พุตมันแม่นยำมาก แต่ใช้เวลานานในการถอดรหัสสตรีมทั้งหมดก่อนเวลาที่กำหนดและเพื่อวัตถุประสงค์ในการทดสอบคุณไม่ต้องการเสียเวลา
  3. -i "INPUT.mkv": ระบุไฟล์อินพุต;
  4. -attach "COVER.jpg": แนบภาพหน้าปก (ภาพขนาดย่อโปสเตอร์อะไรก็ได้) ไปยังเอาท์พุท ภาพหน้าปกมักแสดงในตัวสำรวจไฟล์
  5. -map_metadata 0: คัดลอกข้อมูลเมตาใด ๆ และทั้งหมดจากอินพุต 0 ซึ่งในตัวอย่างเป็นเพียงอินพุต
  6. -map_chapters 0: คัดลอกข้อมูลของบท (ถ้ามี) จากอินพุต 0;
  7. -metadata title="TITLE": ตั้งชื่อของวิดีโอ;
  8. -map 0:0 ...: แมปสตรีม 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 ...: ตัวเลือก codec ของวิดีโอ มันนานมาแล้วที่ฉันแยกมันออกเป็นสองบรรทัด การตั้งค่านี้เหมาะสำหรับวิดีโอ bluray คุณภาพสูง (1080p) ที่มีแถบสีน้อยที่สุดในการไล่ระดับสี (ซึ่ง x265 ดูดได้) เป็นไปได้ว่าการ overkill สำหรับดีวีดีและรายการทีวีและวิดีโอในโทรศัพท์ การตั้งค่านี้ถูกขโมยส่วนใหญ่มาจากการโพสต์ Doom9 นี้ ;
  13. crf=22:...: ความต่อเนื่องของพารามิเตอร์ตัวแปลงสัญญาณวิดีโอ ดูโพสต์ฟอรั่มที่กล่าวถึงข้างต้น;
  14. -c:a copy: คัดลอกไปที่เสียง;
  15. -c:s copy: คัดลอกไปที่คำบรรยาย;
  16. -t 120: หยุดเขียนไปที่เอาต์พุตหลังจาก 120 วินาทีซึ่งให้คลิป 2 นาทีกับเราเพื่อดูตัวอย่างคุณภาพของการย่อ / ขยาย
  17. "OUTPUT.HEVC.DTS.Sample.mkv": ชื่อไฟล์ที่ส่งออก ฉันแท็กชื่อไฟล์ด้วยตัวแปลงสัญญาณวิดีโอและตัวแปลงสัญญาณเสียงหลัก

ต๊าย นี่คือคำตอบแรกของฉันดังนั้นหากมีสิ่งใดที่ฉันพลาดโปรดแสดงความคิดเห็น ฉันไม่ใช่ผู้เชี่ยวชาญด้านการผลิตวิดีโอฉันแค่คนที่ขี้เกียจดูหนังด้วยการใส่แผ่นดิสก์เข้าไปในเครื่องเล่น

PS บางทีคำถามนี้อาจเป็นของที่อื่นเพราะไม่เกี่ยวข้องกับ Unix & Linux


2
สิ่งที่ฉันกำลังมองหา! ความคุ้มครองที่ดีของตัวเลือก คุณรู้หรือไม่ว่า ffmpeg จะหยุดชะงักc:s copyหากไม่มีเนื้อหาคำบรรยาย?
ผู้สูงอายุ Geek

1
@ElderGeek ไม่ ffmpeg จะพูดอะไรบางอย่างถ้าตัวเลือกนั้นมีผลกระทบใด ๆ
Yifeng Mu

ตัวเลือกนี้สร้างขนาดไฟล์ที่เล็กที่สุดเท่าที่จะเป็นไปได้เพื่อการเข้ารหัส h265 ที่ไร้ผู้คนอย่างแท้จริงหรือไม่? ถ้าไม่มีวิธีที่ฉันสามารถทำได้หรือไม่?
Buffer Over อ่าน

1
@TheBitByte ฉันไม่คิดว่าจะมีระดับการบีบอัดแบบ lossless ใน h265 --losslessสำหรับตัวเลือกการบีบอัดน้อยก็เป็นเพียง ฉันค้นหาไร้ประโยชน์สำหรับการแปลงแบบไม่สูญเสียจาก h264 ไปเป็น h265 และสิ่งที่ฉันได้เรียนรู้บอกฉันว่ามันเป็นไปไม่ได้ทางคณิตศาสตร์
Yifeng หมู่

1
คุณควรแก้ไขคำสั่งที่มีการ--losslessสลับจากคำตอบนี้เพราะใส่ไว้เป็นคำตอบสำหรับคำถามนี้ดูเหมือนว่าคุณกำลังบอกว่ามันเป็นการบีบอัดแบบไม่สูญเสียซึ่งทำให้เข้าใจผิด
Hashim

8

ฉันเพิ่งพบปัญหาในการแปลงรหัสแคตตาล็อกวิดีโอทั้งหมดของฉันให้เป็น HEVC ฉันใช้https://github.com/FallingSnow/h265izeด้วยการตั้งค่าต่อไปนี้

h265ize -v -m medium -q 20 -x - no-sao --aq-mode 3 - ลบ --stats

-v - Verbose Output
-m Medium - ความเร็วการเข้ารหัสปานกลาง (คุณภาพที่สูงขึ้นเล็กลง, อะไรที่ช้ากว่าที่ฉันคิดว่าไม่คุ้มกับเวลา / คุณภาพที่ต่างกัน)
-q 20 - CRF ที่ใช้, 20 คล้ายกับ 18 หรือมากกว่าใน x264 นี่คือเนื้อหา 1080p (90% ของทีวีของฉัน) ฉันมักจะใช้ 22 สำหรับภาพยนตร์ 4K ของฉัน
-x - ใช้คำสั่งที่กำหนดจากศูนย์กลาง x265
- ไม่มี - saoปิดการใช้งานตัวอย่าง Adaptive Offset (ปรับปรุงความเร็วการเข้ารหัส)
- โหมดaq 3 - ใช้ Adaptive Quantisation พร้อมความแปรปรวนอัตโนมัติช่วยให้การเข้ารหัส 8 บิตโดยเฉพาะในพื้นที่มืดหยุดแถบส่วนใหญ่ที่อาจเกิดขึ้นได้ (โดยเสียเวลาของการเข้ารหัส)
- ลบ - แทนที่ไฟล์การเข้ารหัสด้วยไฟล์ที่เข้ารหัส (ทดสอบก่อนใช้อันนี้ ) -
เริ่ม - เขียนสถิติออกไปยังไฟล์ csv ในรูทของพา ธ ที่คุณใช้งาน

ความเร็วการเข้ารหัสอยู่ที่ประมาณ 30fps (สำหรับสิ่งที่ 1080p มากที่สุด) บนแท่นขุดของฉัน Dual Xeon E5 2687W v2 แต่ฉันบังคับให้กระบวนการ FFMPEG ไม่ใช้ด้านแรกของโปรเซสเซอร์ (เป็นเซิร์ฟเวอร์ Plex ของฉันดังนั้นต้องแน่ใจว่ามีโอเวอร์เฮดสำหรับการแปลงรหัสหากจำเป็นในการเล่น ฯลฯ )

ใช่มันใช้เวลาสักครู่ในการแปลงส่วนใหญ่และตอนนี้ฉันมีงานที่กำหนดเวลาไว้ซึ่งรันสองครั้งต่อวันเพื่อเข้ารหัสเนื้อหาจากวันนั้นเป็น x265

ประหยัดพื้นที่ได้อย่างมาก SAN เริ่มต้นของฉันใช้งานที่ 20Tb ตอนนี้ประมาณ 12 แต่ก็มีการเพิ่มเนื้อหาด้วยเช่นกันอีก 6 เดือน

ฉันได้เริ่มแปลงรหัสภาพยนตร์ของฉันทั้งหมดด้วยเช่นกันซึ่งเป็นกระบวนการต่อเนื่องเนื่องจากฉันต้องมีระดับ ID (Radarr โชคดีที่ติดป้ายกำกับแล้ว) และใช้การตั้งค่าแปลงรหัสหนึ่งในสามรายการ:

-m slower -q 18 -x --no-sao --aq-mode 3สำหรับ 720p transcodes
-m medium -q 20 -x --no-sao --aq-mode 3สำหรับ 1080p
-m medium -q 22 -x --no-saoสำหรับ 2160p

หวังว่าจะช่วยให้บางคน ตะโกนถ้าทุกคนต้องการมือตั้งมันทั้งหมดขึ้นมา และก่อนที่คุณจะเข้ารหัสทุกอย่างให้กับ x265 ให้คิดถึงการเล่นหากลูกค้าไม่รองรับ x265 เนทีฟการแปลงสัญญาณอาจมีราคาแพงในแง่ของ CPU และคุณภาพ


ด้วยx265 2.4 และใหม่กว่า (ด้วยแลมบ์ดาตารางใหม่ที่ให้การเข้ารหัสที่คมชัดกว่า) SAO จึงเป็นสิ่งที่ดีสำหรับคุณภาพต่อบิตเรต มันยังคงเปื้อนเล็กน้อย แต่ลดสิ่งประดิษฐ์อื่น ๆ ให้คุ้มค่า
Peter Cordes

-q 20ไม่ CRF 20 ก็คง ratecontrol โหมดเริ่มต้นและแนะนำ CRF, ยก QP บางอย่างในฉากที่ซับซ้อนสูงจึงไม่ใช้จ่ายมากเกินไปบิตจำนวนมากในฉากที่ยากเกินไปที่จะเข้ารหัส (หากคุณต้องการใกล้เคียงกับ QP ที่เหมือนกันให้เพิ่มqcompขึ้นจากค่าเริ่มต้น 0.6 เป็น 0.7 หรือ 0.8 ใกล้เคียงกับ 1.0 ใกล้เคียงกับ CQP)
Peter Cordes

3

ไวยากรณ์ที่ถูกต้องเพื่อเปิดใช้งานโหมด lossless สำหรับตัวเข้ารหัส x265 ใน ffmpeg คือ-x265-params lossless=1(คุณต้องต่อท้าย=1)

อย่างไรก็ตามสำหรับการเข้ารหัสแบบ lossless มีตัวเลือก codec ที่ดีกว่า ฉันพบโดยการทดสอบว่าFFV1บีบอัดได้ดีกว่าอย่างมาก (ขนาดไฟล์ = ~ 80% ของ x265) อย่างน้อยในวิดีโอบางประเภท (หากเลือกการตั้งค่าที่ดีที่สุดสำหรับตัวแปลงสัญญาณทั้งสอง) และยังทำงานได้เร็วขึ้นและ (AFAIK) ไม่ได้ถูกกีดกันจากสิทธิบัตร นั่นคือมันเหนือกว่า H.265 แบบไม่สูญเสียทุกวิถีทางสำหรับการเก็บถาวรวิดีโอ

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