품질 손실 없이 x265(HEVC)에서 비디오 라이브러리를 다시 인코딩합니다.

품질 손실 없이 x265(HEVC)에서 비디오 라이브러리를 다시 인코딩합니다.

공간을 확보하기 위해 비디오 라이브러리를 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

--losslessx265에 옵션이 있다는 것을 발견했습니다 .http://x265.readthedocs.org/en/default/lossless.html.

그러나 올바르게 사용하는 방법을 모르겠습니다. 다음과 같이 사용해 보았지만 반대 결과가 나왔습니다(비디오가 더 픽셀화되었습니다).

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

답변1

내 경험에 따르면, 품질 저하가 전혀 발생하지 않기를 원한다면 무손실을 원하는 것입니다.

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

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

대부분의 스위치(값이 없는 옵션)는 이 방식으로 지정할 수 있습니다( 바이너리에서만 직접 사용되는 x265CLI를 사용하는 스위치 제외 ).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 120120초 후에 출력에 쓰기를 중지한다는 의미입니다. . 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 ...: 비디오 코덱 옵션. 너무 길어서 두 줄로 나누었습니다. 이 설정은 그라데이션의 밴딩이 최소화된 고품질 Blu-ray 비디오(1080p)에 적합합니다(x265는 이 경우 좋지 않습니다). DVD, TV 프로그램, 전화 비디오의 경우 이는 아마도 과잉일 것입니다. 이 설정의 대부분은이 Doom 9 게시물;
  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

나는 최근 전체 비디오 디렉토리를 HEVC로 트랜스코딩하는 데 어려움을 겪었습니다. 나는 사용한다https://github.com/FallingSnow/h265ize다음 설정을 사용하십시오.

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

-V- 자세한 출력
-m 중간- 적당한 인코딩 속도(품질이 낮을수록 시간/품질 차이를 감수할 만큼 느린 것은 없습니다)
-q 20- CRF를 사용하면 20은 x264의 18 정도와 비슷하지만, 안녕하세요. 이는 1080p 콘텐츠(내 TV의 90%)에 작동하며, 4K 영화에는 22를 사용하는 경향이 있습니다.
-엑스- 중앙에서 정의된 x265 명령 사용
--야생 창녀샘플 적응형 오프셋 끄기(인코딩 속도 증가)
--aq-모드 3- 특히 어두운 영역에서 8비트 인코딩을 지원하는 자동 분산이 포함된 적응형 양자화를 사용하여 가능한 대부분의 밴딩을 방지합니다(그러나 인코딩 시간이 소요됨).
- 삭제- 인코딩된 파일을 인코딩된 파일로 대체(이 파일을 사용하기 전에 테스트)
--통계 데이터- 실행 경로의 루트에 있는 csv 파일에 통계를 기록합니다.

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

예, 대부분의 콘텐츠를 변환하는 데 시간이 좀 걸렸으며 이제는 해당 날짜의 콘텐츠를 x265로 인코딩하기 위해 하루에 두 번 실행되는 예약된 작업이 있습니다.

절약된 공간은 엄청납니다. 내 원래 SAN 사용량은 20Tb였지만 지금은 약 12Tb이지만 분명히 6개월 분량의 콘텐츠가 추가되었습니다.

또한 모든 영화의 트랜스코딩을 시작했지만 품질 수준을 식별하고(다행히 Radarr에서 플래그를 잘 지정함) 세 가지 트랜스코딩 설정 중 하나를 사용해야 하므로 진행 중인 프로세스입니다.

-m slower -q 18 -x --no-sao --aq-mode 3720p 트랜스코드
-m medium -q 20 -x --no-sao --aq-mode 31080p
-m medium -q 22 -x --no-sao2160p

이것이 어떤 사람들에게 도움이 되기를 바랍니다. 이 모든 것을 설정하는 데 도움이 필요한 사람이 있으면 나에게 소리쳐 주세요. 모든 것을 x265로 인코딩하기 전에 재생을 고려하십시오. 클라이언트가 기본 x265를 지원하지 않는 경우 트랜스코딩은 CPU 및 품질 측면에서 비용이 많이 들 수 있습니다.

답변3

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

그러나 무손실 인코딩의 경우 더 나은 코덱 선택이 있습니다. 테스트를 통해 알아낸FFV1적어도 일부 비디오 유형에서는 압축이 훨씬 더 좋습니다(파일 크기 = x265의 ~80%)(두 코덱 모두에 대해 최적의 설정을 선택한 경우). 또한 더 빠르게 실행되며 (내가 아는 한) 특허로 인해 방해를 받지 않습니다. 즉, 비디오 보관의 모든 측면에서 무손실 H.265보다 성능이 뛰어납니다. 그러나 타협점은 현재 재생 소프트웨어 및 하드웨어와의 호환성입니다.

관련 정보