품질 손실없이 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

그러나 문제는 일부 비디오의 경우 CRF 값 28이 충분하고 일부 비디오의 경우 더 낮은 CRF가 필요하다는 것입니다. 이것은 큰 비디오의 작은 부분을 변환하여 수동으로 확인 해야하는 것입니다. 그러나 대량 변환에서 각 비디오를 수동으로 어떻게 확인합니까? avconv입력 비디오에 따라 CRF를 지능적으로 조정할 수 있는 방법이 있습니까?

업데이트 -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파일이 이전에 손실 된 코덱을 디코딩 한 다음 손실없이 디코딩 한 작업을 포함하는 경우 실제로 파일을 확대 할 수 있습니다. 품질은 입력과 정확히 동일하게 유지됩니다.
Golar Ramblar

2
소스가 손실로 인코딩 된 경우 (대부분 가능성이 높음) 달성하려는 것은 불가능합니다. 무손실이 아닌 트랜스 코딩은 품질을 더 저하 시키며 (즉시 눈에 띄지 않더라도) 손실에서 무손실로 변환하면 더 큰 파일 크기를 얻게됩니다.
Sarge Borsch 2016 년

답변:


58

내 경험에 비추어 볼 때 품질 손실을 절대 원하지 않으면 무손실을 찾으십시오.

확실하지 avconv않지만 입력 한 명령은 내가하는 것과 동일하게 보입니다 FFmpeg. 다음 FFmpeg과 같이 매개 변수를 전달할 수 있습니다.

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

대부분의 x265스위치 (값이없는 옵션)는 이와 같이 지정할 수 있습니다 (CLI 전용 스위치는 제외하고 x265이진 스위치에만 직접 사용됨 ).

그 방법으로 x265인코딩 과 내 경험을 공유하고 싶습니다 . 대부분의 비디오 (WMV, MPEG 또는 AVC / H.264)에는을 사용 crf=23합니다. x265나머지 매개 변수를 결정하고 일반적으로 충분한 작업을 수행합니다.

그러나 비디오 전체를 트랜스 코딩하기 전에 종종 비디오의 작은 부분을 변환하여 설정을 테스트합니다. 다음은 스트림 0이 비디오이고 스트림 1이 DTS 오디오이고 스트림 2가 자막 인 mkv 파일의 예입니다.

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_bannerFFmpeg시작시 빌드 정보를 표시 하지 않습니다 . 콘솔에서 위로 스크롤 할 때보고 싶지 않습니다.
  2. -ss 0입력 디코딩을 시작하기 전에 0 초를 찾습니다. 이 매개 변수가 입력 파일 뒤에 그리고 출력 파일 앞에 제공 되면, 출력 옵션이 되고 ffmpegx 초까지 입력을 디코딩하고 무시하도록 지시 한 다음 출력에 쓰기 시작합니다. 입력 옵션 으로서는 정확도가 떨어지지 만 (대부분의 컨테이너 형식에서는 검색이 정확하지 않기 때문에) 시간이 거의 걸리지 않습니다. 출력 옵션은 매우 정확하지만 지정된 시간 전에 모든 스트림을 디코딩하는 데 상당한 시간이 걸리며 테스트 목적으로 시간을 낭비하고 싶지 않습니다.
  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 ...: 비디오 코덱 옵션. 너무 길어서 두 줄로 나 broken습니다. 이 설정은 그라디언트의 최소 밴딩 (x265가 빨라짐)이있는 고품질의 Bluayay 비디오 (1080p)에 적합합니다. DVD 및 TV 쇼 및 전화 비디오에 대한 과잉 일 가능성이 높습니다. 이 설정은 대부분 이 Doom9 게시물 에서 도난당했습니다 .
  13. crf=22:...: 비디오 코덱 매개 변수 계속. 위에서 언급 한 포럼 게시물을 참조하십시오.
  14. -c:a copy: 오디오를 통해 복사;
  15. -c:s copy: 자막을 복사합니다.
  16. -t 120: 120 초 후에 출력에 대한 쓰기를 중지하면 트랜스 코딩 품질을 미리 볼 수있는 2 분 클립이 제공됩니다.
  17. "OUTPUT.HEVC.DTS.Sample.mkv": 출력 파일 이름. 비디오 코덱과 기본 오디오 코덱으로 파일 이름을 태그합니다.

아휴. 이것은 첫 번째 답변이므로 놓친 것이 있으면 의견을 남겨주십시오. 저는 비디오 제작 전문가가 아닙니다. 디스크를 플레이어에 넣어서 영화를보기에는 너무 게으른 사람 일뿐입니다.

추신. 어쩌면이 질문은 Unix & Linux와 관련이 없기 때문에 다른 곳에 속할 수도 있습니다.


2
정확히 내가 찾던 것! 옵션의 좋은 범위. c:s copy자막 콘텐츠가없는 경우 ffmpeg 가 작동하지 않는지 알고 있습니까?
Geek

1
@ElderGeek 아니요, ffmpeg는 해당 옵션이 영향을 미치는 경우에만 무언가를 말합니다.
Yifeng Mu

이 옵션은 손실이없는 h265 인코딩을 위해 가능한 가장 작은 파일 크기를 생성합니까? 그렇지 않다면 내가 할 수있는 방법이 있습니까?
버퍼 오버 읽기

1
@TheBitByte h265에는 무손실 압축 수준이 없다고 생각합니다. 압축이없는 옵션의 경우는 단지 --lossless입니다. 나는 h264에서 h265 로의 무손실 변환을 헛되이 검색했으며, 내가 배운 것은 수학적으로 불가능하다는 것을 알려줍니다.
Yifeng Mu

1
--lossless이 답변 에서 스위치를 포함하는 명령을 실제로 편집해야 합니다.이 질문에 대한 답변으로 무손실 압축이라고 말하는 것처럼 들리므로 오해의 소지가 있습니다.
Hashim

8

최근에 전체 비디오 카탈로그를 HEVC로 트랜스 코딩하는 데 어려움을 겪었습니다. 내가 사용 https://github.com/FallingSnow/h265ize을 다음과 같은 설정으로.

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

-v -Verbose Output
-m medium- 중간 인코딩 속도 (더 작은 고품질, 느리게 느껴지는 것은 시간 / 품질 dif의 가치가 없음)
-q 20- 사용 된 CRF, 20은 x264에서 18과 비슷하지만 이봐. 이것은 1080p 콘텐츠 (TV의 90 %)를위한 것입니다. 4K 영화에 22를 사용하는 경향이 있습니다.
-x -x265 중앙 정의 명령 사용
--no-sao 는 샘플 적응 형 오프셋을 끕니다 (인코딩 속도 향상)
--aq-mode 3- 자동 분산과 함께 적응 양자화를 사용하고, 특히 어두운 영역에서 8 비트 인코딩을 돕고, 발생할 수있는 대부분의 밴딩을 중지합니다 (인코딩 시간이
소요됨) -삭제-인코딩 파일을 인코딩 된 파일로 대체 (이 파일을 사용하기 전에 테스트) )
--stats -실행 한 경로의 루트에있는 CSV 파일에 통계를 씁니다.

내 장비의 인코딩 속도는 약 30fps (대부분의 1080p 항목)입니다. Dual Xeon E5 2687W v2이지만 FFMPEG 프로세스가 프로세서 중 하나의 첫 번째면을 사용하지 않도록 강요합니다 (Plex 서버이므로 재생 등에 필요한 경우 트랜스 코드에 대한 오버 헤드가 있는지 확인해야합니다)

예, 대부분을 변환하는 데 시간이 걸렸으며 이제는 하루에 두 번 실행하여 그 날부터 x265까지 물건을 인코딩하는 예약 된 작업이 있습니다.

공간 절약은 엄청났습니다. 내 초기 SAN은 20Tb를 사용했으며 이제는 약 12이지만 6 개월 더 많은 콘텐츠가 추가되었습니다.

그러나 모든 영화를 트랜스 코딩하기 시작했지만, ID 품질 수준 (라운 더라 레이블은 멋지게 라벨링)을 거쳐 세 가지 트랜스 코딩 설정 중 하나를 사용해야하기 때문에 지속적인 프로세스입니다.

-m slower -q 18 -x --no-sao --aq-mode 3720p 트랜스 코딩의 경우 2160p의
-m medium -q 20 -x --no-sao --aq-mode 31080p
-m medium -q 22 -x --no-sao

희망은 어떤 사람들에게 도움이됩니다. 누구든지 손을 모두 설정해야하는 경우 소리 치십시오. 그리고 x265로 모든 것을 인코딩하기 전에, 클라이언트가 x265 네이티브를 지원하지 않는다면, 재생은 CPU와 품질면에서 비쌀 수 있습니다.


(새로운 람다 테이블 나중에 x265 2.4 , SAO는 일반적으로 비트 레이트에 따라 품질에 대한 좋은 것입니다주고 선명한 인코딩이). 여전히 약간 번져 있지만 가치가있는 다른 인공물을 줄입니다.
Peter Cordes

-q 20CRF 20이 아니며, 일정한 QP ratecontrol 입니다. 기본 및 권장 모드 인 CRF는 매우 복잡한 장면에서 QP 를 높여서 인코딩하기 어려운 장면에 너무 많은 비트를 소비하지 않습니다 . (균일 한 QP에 가깝게 qcomp하려면 기본값 0.6에서 0.7 또는 0.8로 올립니다 . 1.0에 가까울수록 CQP에 가까워집니다.)
Peter Cordes

3

ffmpeg에서 x265 인코더에 대해 무손실 모드를 활성화하는 올바른 구문은 -x265-params lossless=1(추가해야 함 =1)입니다.

그러나 무손실 코딩의 경우 더 나은 코덱 선택이 있습니다. 테스트를 통해 FFV1이 적어도 일부 비디오 종류에서 (파일 크기 = x265의 ~ 80 %) 훨씬 더 잘 압축되는지 확인했습니다 (두 코덱 모두에 대해 최상의 설정을 선택한 경우). 그리고 그것은 또한 더 빨리 작동하며 (AFAIK)는 특허에 의해 방해받지 않습니다. 즉, 비디오 아카이빙에있어 모든면에서 무손실 H.265보다 우수합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.