공간을 확보하기 위해 비디오 라이브러리를 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
x265의 --lossless
옵션 : http://x265.readthedocs.org/en/default/lossless.html .
하지만 올바르게 사용하는 방법을 모르겠습니다. 다음과 같은 방법으로 사용해 보았지만 반대의 결과가 나왔습니다 (동영상이 더욱 픽셀 화되었습니다).
avconv -i input.mp4 -c:v libx265 -x265-params lossless -c:a copy output.mp4
주석
답변
내 경험에 비추어 볼 때 품질 손실이 전혀 없도록하려면 –lossless는 무엇을 찾고 있는지.
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이 비디오 인 mkv 파일이 스트림 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 시간 형식을 사용할 수도 있습니다.
이제 한 줄씩 :
-
-hide_banner
는FFmpeg
가 시작시 빌드 정보를 표시하지 않도록합니다. 콘솔에서 위로 스크롤 할 때보고 싶지 않습니다. -
-ss 0
는 입력 디코딩을 시작하기 전에 0 초를 찾습니다.이 매개 변수가 입력 파일 뒤 와 출력 파일 앞 에 주어지며, 출력 옵션 이되어ffmpeg
를 사용하여 x 초까지 입력을 디코딩하고 무시한 다음 출력에 쓰기를 시작합니다. 입력 옵션으로는 정확도가 떨어지지 만 (대부분의 컨테이너 형식에서 검색이 정확하지 않기 때문에) 시간이 거의 걸리지 않습니다.출력 옵션으로는 매우 정확하지만 지정된 시간 전에 모든 스트림을 디코딩하는 데 상당한 시간이 걸리며 테스트 목적으로 시간을 낭비하고 싶지 않습니다. -
-i "INPUT.mkv"
: 입력 파일 지정; -
-attach "COVER.jpg"
: 표지 아트 (썸네일 그림, 포스터 등)를 출력에 첨부합니다. 커버 아트는 일반적으로 파일 탐색기에 표시됩니다. -
-map_metadata 0
: 입력 0의 모든 메타 데이터를 복사합니다.이 예에서는 입력일뿐입니다. -
-map_chapters 0
: 입력 0에서 장 정보 (있는 경우)를 복사합니다. -
-metadata title="TITLE"
: 동영상 제목을 설정합니다. -
-map 0:0 ...
: 입력 0의 스트림 0을 매핑합니다. 즉, 입력의 첫 번째 스트림이 출력에 기록되도록합니다. 이 스트림은 동영상 스트림이므로 출력 의 첫 번째 video 스트림이므로 스트림 지정자:s:v:0
입니다. 언어 설정 태그를 영어로 지정합니다. -
-map 0:1 ...
: 8 행과 유사하게 두 번째 스트림 (DTS 오디오)을 매핑하고 언어와 제목을 설정합니다 (선택시 쉽게 식별 할 수 있도록 from players); -
-map 0:2 ...
:이 스트림이 자막이라는 점을 제외하고 9 행과 유사합니다. -
-metadata:s:t:0 ...
: 표지 아트에 대한 메타 데이터를 설정합니다. mkv 컨테이너 형식에 필요합니다. -
-c:v libx265 ...
: 비디오 코덱 옵션. 너무 길어서 두 줄로 나눴습니다. 이 설정은 그래디언트의 밴딩이 최소화 된 고품질 블러 레이 비디오 (1080p)에 적합합니다 (x265가 짜증나게 함). DVD 및 TV 쇼 및 전화 비디오에는 과잉 일 가능성이 높습니다. 이 설정은 대부분 이 Doom9 게시물 에서 도용되었습니다. -
crf=22:...
: 동영상 코덱의 연속 매개 변수. 위에 언급 된 포럼 게시물을 참조하십시오. -
-c:a copy
: 오디오 복사 -
-c:s copy
: 자막 복사; -
-t 120
: 120 초 후에 출력에 쓰기를 중지합니다. 그러면 트랜스 코딩 품질을 미리 볼 수있는 2 분 클립이 제공됩니다. -
"OUTPUT.HEVC.DTS.Sample.mkv"
: 출력 파일 이름. 동영상 코덱과 기본 오디오 코덱으로 파일 이름에 태그를 지정합니다.
휴. 이것이 나의 첫 번째 대답이므로 내가 놓친 것이 있으면 의견을 남겨주세요. 저는 비디오 제작 전문가가 아닙니다. 디스크를 플레이어에 넣어서 영화를보기에는 너무 게으른 사람 일뿐입니다.
PS.이 질문은 다른 곳에있을 수도 있습니다. Unix & Linux와 밀접한 관련이 없습니다.
댓글
- 정확히 제가 찾던 것 ! 옵션의 좋은 범위. 자막 콘텐츠가없는 경우 ffmpeg가
c:s copy
에서 멈출 것인지 알고 있습니까? - @ElderGeek 아니요, ffmpeg는 해당 옵션이 효과가있는 경우에만 말을합니다.
- @TheBitByte 예, 아니오, 제 생각에. ' 무손실 h265 파일을 원하지 않습니다. ' 어떤 종류의 압축도 사용하지 않는 원시 비트 스트림입니다. ' 거대합니다. h265 또는 특히 x265 구현에 대해 이해 한 바에 따르면 무손실 압축 방법이 아닙니다. 압축 정도에 관계없이 정보가 손실되지만 시청 품질이 반드시 손실되는 것은 아닙니다. 하지만 저는 ' h265 주제에 대한 전문가가 아니기 때문에 ' 무언가를 놓쳤을 가능성이 있습니다.
- @ TheBitByte 저는 ' h265에 무손실 압축 수준이 있다고 생각하지 않습니다. 무 압축 옵션의 경우 '는
--lossless
입니다. h264에서 h265 로의 무손실 변환을 헛되이 검색했는데 ' 배운 사실에 따르면 ' 수학적으로 불가능합니다. -
--lossless
스위치가 포함 된 명령을이 답변에서 수정해야합니다.이 질문에 대한 답변으로 입력하면 마치 당신처럼 들리기 때문입니다. ' '의 무손실 압축으로 오해의 소지가 있습니다.
답변
최근에 전체 동영상 카탈로그를 HEVC로 트랜스 코딩하는 문제를 겪었습니다. .
h265ize -v -m medium -q 20 -x –no-sao- -aq-mode 3 –delete –stats
-v -자세한 출력
-m medium -중간 인코딩 속도 (더 작은 더 높은 품질, 더 느린 것은 시간 / 품질 dif의 가치가 없음)
-q 20 -사용 된 CRF, 20은 x264에서 18 정도와 비슷하지만 헤이.이것은 1080p 콘텐츠 (내 TV의 90 %) 용입니다. 저는 주로 4K 영화에 22 개를 사용합니다.
-x -x265 중앙 정의 명령 사용
-no-sao 는 샘플 적응 오프셋을 끕니다 (인코딩 속도 향상).
-aq-mode 3 -자동 분산과 함께 적응 양자화 사용, 특히 어두운 영역에서 8 비트 인코딩 지원, 중지 발생할 수있는 대부분의 밴딩 (인코딩 시간이 소요됨)
-delete -인코딩 파일을 인코딩 된 파일 (이 파일을 사용하기 전에 테스트)
-stats -루트의 csv 파일에 통계 기록 내 장비에서 인코딩 속도는 약 30fps (대부분의 1080p 항목에 대해)입니다. Dual Xeon E5 2687W v2,하지만 FFMPEG 프로세스가 프로세서 중 하나의 첫 번째면을 사용하지 않도록 강제합니다 (이는 내 Plex 서버이므로 재생 등에서 필요한 경우 트랜스 코딩에 대한 오버 헤드가 있는지 확인해야합니다).
예, 대부분을 변환하는 데 시간이 걸리고 이제는 하루에 두 번 실행되는 작업을 예약하여 그날부터 x265로 인코딩합니다.
공간 절약 엄청났습니다. 내 초기 SAN은 20Tb 사용 이었지만 지금은 12 개 정도 였지만 6 개월 더 많은 콘텐츠가 추가되었습니다.
저는 내 모든 영화도 트랜스 코딩하기 시작했습니다. 품질 수준을 식별하고 (Radarr는 다행히 라벨링) 세 가지 트랜스 코딩 설정 중 하나를 사용해야하므로 진행중인 프로세스입니다. 720p 트랜스 코드의 경우
-m slower -q 18 -x --no-sao --aq-mode 3
1080p 용 -m medium -q 20 -x --no-sao --aq-mode 3
-m medium -q 22 -x --no-sao
2160p 용
어떤 사람들을 돕고 싶습니다. 모든 것을 x265로 인코딩하기 전에 재생에 대해 생각해보십시오. 클라이언트가 x265 네이티브를 지원하지 않는 경우 트랜스 케이드는 CPU 및 품질 측면에서 비용이 많이들 수 있습니다.
댓글
- x265 2.4 이상 (더 선명한 인코딩을 제공하는 새로운 람다 테이블 포함)에서 SAO는 일반적으로 비트 레이트 당 품질에 좋은 점입니다. 여전히 약간 번짐은 있지만 그만한 가치가있을만큼 다른 아티팩트를 줄입니다.
-
-q 20
는 CRF 20이 아닙니다. ' s 일정 QP 속도 제어 . 기본 및 권장 모드 인 CRF는 복잡도가 높은 장면에서 QP를 약간 높여서 ' 너무 어려운 장면에 너무 많은 비트를 소비하지 않습니다. 인코딩. (균일 한 QP에 더 가깝게하려면qcomp
를 기본값 0.6에서 0.7 또는 0.8로 올립니다. 1.0에 가까울수록 CQP에 더 가깝습니다.) - 방법 소스가 무엇인지 모르는 경우 ' HDR / SDR 인코딩을 처리합니까?
답변
ffmpeg에서 x265 인코더에 대해 무손실 모드를 활성화하는 올바른 구문은 -x265-params lossless=1
입니다 (=1
를 추가해야합니다. div>).
그러나 무손실 코딩의 경우 더 나은 코덱 선택이 있습니다. 테스트를 통해 FFV1 이 적어도 일부 종류의 비디오에서 훨씬 더 잘 압축된다는 것을 발견했습니다 (파일 크기 = x265의 ~ 80 %) (둘 다에 대해 최상의 설정을 선택한 경우 코덱). 또한 더 빠르게 작동하며 (AFAIK)는 특허에 의해 방해받지 않습니다. 즉, 비디오 보관에있어 모든면에서 무손실 H.265보다 우수합니다. 그러나 타협은 현재 재생 소프트웨어 및 하드웨어와의 호환성입니다.
--lossless
는 이전에 손실 된 코덱을 디코딩 한 후 실제로 파일을 확대 할 수 있습니다. 무손실로 디코딩 한 내용을 인코딩합니다. 품질은 입력과 정확히 동일하게 유지됩니다.