품질을 유지하면서 ffmpeg를 사용하여 4k에서 1080p로 다운 샘플링하는 방법은 무엇입니까?


20

1080p로 가져와야하는 MP4 형식의 4K 3840x2160 영상이 있습니다. 나는 달리기를 시도했다

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

그러나 결과는 4 : 1으로 확대하는 것처럼 전체 이미지가 정사각형 "타일"로 구성되어 품질이 매우 떨어집니다.

이 명령을 실행 한 결과는 다음과 같습니다.

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

나는 ffmpeg가 훌륭한 도구라는 것을 경험을 통해 알고 있기 때문에 어떻게 든 옵션 / 매개 변수를 조여야합니다 ...

어떻게해야합니까?


명령에서 완전한 콘솔 출력을 보여주십시오. 짧은 세그먼트 만 인코딩 -t 10하면 10 초 출력을 추가 할 수 있습니다. 왜 다운 스케일을 원하십니까? 스케일링 된 출력의 사용 사례는 무엇입니까? 이 정보는보다 정확한 답변을 제공하는 데 도움이됩니다.
llogan

@LordNeckbeard 방금 콘솔 출력을 추가했습니다. 이 클립을 나와 함께 작업하는 사람들과 더 쉽게 공유 할 수 있도록 축소하고 싶습니다.
라라 마이클스

1
-c:a copy오디오 스트림을 원하지 않거나 다시 인코딩 할 필요가 없으므로 잊지 마십시오 . -map 0챕터 메타 데이터 또는 기타 내용을 복사하는 데 사용 합니다. (ffmpeg는 기본적으로 1 vid + 1 aud 만 사용합니다.)
Peter Cordes

1
또한 -sws_flags lanczos+print_info기본값보다 더 나은 스케일링 알고리즘을 사용할 것입니다 (생각하는 이중 선형). stlb의 답변은 프로세스의 비디오 인코딩 부분을 다룹니다.
Peter Cordes

2
@PeterCordes 또는 scale=1920:-2:flags=lanczos. 나는 또한 -2존재하지 않는 대답에서 규모에 대해 언급하려고했습니다 . 당신은 넣을 수 있습니다 모르는 사람들을 위해 -2너비 또는 높이 및 가로 세로 비율을 유지하면서 자동으로 올바른 값을 제공 하고 (yuv420p 출력을 위해 libx264에 필요한) 2에 의해 값 나눌 만들기.
llogan

답변:


17

ffmpeg의 기본 설정은 품질이 매우 낮으며 코덱이나 품질 매개 변수를 지정하지 않으므로 기본값을 사용합니다 (포럼에서 많은 질문을 생성하기 때문에 개발자가 문제를 해결하지 못하는 이유는 모르겠습니다) 어디에나).

편집 : 기본값은 이제 제정신입니다. 최근 ffmpeg 빌드를 사용하면 유용한 결과를 얻기 위해 입력 및 출력 파일 이외의 것을 지정할 필요가 없습니다. 물론 마음의 욕망을 조정할 수 있습니다.

-c:v libx264 -crf 20 -preset slow명령을 추가하십시오 .

  • -c:v libx264 libx264 인코더를 사용하도록 지시합니다.
  • crf 20 Constant Rate Factor 양자화 기 (역설적으로 가변 비트 레이트를 의미하지만 일정한 품질을 의미 함)의 값을 20으로 사용합니다 (꽤 좋은 품질; 품질이 낮을수록 파일이 높을수록 파일이 높을수록 더 크거나 작습니다).
  • slow사전 설정은 기본 (중간)보다 그것으로 조금 더 많은 노력을두고 수단 것을 인코더 설정의 무리에 대한 바로 가기입니다.

이 설정을 조정할 수 있습니다 . 회전 할 노브에 대한 지침 은 h.264 인코딩 안내서 를 참조하십시오 .

오디오를있는 그대로 사용하려면을 추가하십시오 c:a copy. 다시 인코딩하지 않고 오디오 스트림을 그대로 복사합니다.


기본값은 인코더에 따라 다릅니다. libx264는 일반적으로 기본적으로 MP4 출력에 사용되며 추가 옵션없이 좋은 품질의 출력을 생성하지만 문제의 ffmpeg 빌드는이 인코더를 지원하지 않는 것으로 보이므로 mpeg4MPEG-4 Part 2 비디오를 제작 하는 고대 인코더를 사용합니다. 전성기 (320x240 등)의 기본값은 더 깔끔했습니다.
llogan

libx264가 현재 기본값이라고 들었습니다.
stib

나는 CRF (20)가 예쁜 말하고 싶지만 이놈의 좋은. 18은 기능적으로 무손실입니다. 내 비디오의 대부분을 23시에합니다.
user24601

내 작품의 대부분은 SD 카드에서 로컬로 작동하는 재생 장치에 표시됩니다. 크기에 맞게 많이 최적화 할 필요가 없으므로 품질을 최대한 높게 유지합니다. 웹을 통해 전달하는 경우 전화를 겁니다.
stib

이것은 나에게 도움이되지 않았다. 비디오에서 움직임이 발생할 때마다 여전히 이상한 점이 있습니다. crf 18, 느리게 사전 설정. 2.7k-> 1080p.
rewolf

0

원하는 경우 avconv를 사용하십시오 .

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.