ffmpeg를 사용하여 비디오(+ 오디오)를 정확하게 절단

ffmpeg를 사용하여 비디오(+ 오디오)를 정확하게 절단

내 웹사이트에서 사용자가 내가 제공한 소스 비디오에서 자신만의 클립을 정확하게 만들 수 있기를 바랍니다.

먼저 웹사이트에 적합한 파일로 변환하려는 소스 비디오 파일이 있습니다.

Input #0, matroska,webm, from 'source.mkv': 
Duration: 00:28:18.57, start: 0.000000, bitrate: 10183 kb/s 
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 48 tbc (default)
Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s (default)

ffmpeg를 사용하여 다음과 같이 변환합니다.

ffmpeg -i source.mkv -c:v libx264 -c:a aac -strict experimental -vf scale="960:-1" source.mp4

이 비디오를 다시 보면 품질이 좋고 파일 크기가 내 필요에 맞게 충분히 작으며 내 웹사이트에서 로드/재생됩니다.

사용자가 이 비디오의 시작과 끝점을 선택하고 클립을 만들 수 있는 웹페이지가 있습니다. 다음은 제가 사용하는 ffmpeg 명령의 예입니다.

-ss 577.920 -i source.mp4 -t 011.980 -codec:v copy -codec:a copy -vf scale="960:-1" clip1.mp4

문제는 클립이 항상 시간적으로 정확하지 않다는 것입니다. 일반적으로 오디오는 충분히 정확하지만 비디오는 0.5초 정도 일찍 멈춥니다.

0.2초라는 정확하고 동기화된 시간을 만들 수 있는 방법이 있나요?

편집: 추가해도 -force_key_frames 00:00:00.2도움이 되지 않았습니다.

편집: 좋은 결과 -c:v libx264 -c:a aac -strict experimental대신 사용하기 위해 클리핑을 변경했습니다 .-codec:v copy -codec:a copy

파일은 문제 없이 외부에서 재생할 수 있습니다. 하지만 파일을 html5 비디오 요소에 로드하고 재생할 때 비디오의 마지막 부분(오디오는 괜찮음)이 멈춥니다. 마지막으로 얼어붙는 부분의 길이는 1초 미만입니다.

다른 비디오 인코더로 시도해 봐야 할까요? libx264의 가장 좋은 대안은 무엇입니까? 염두에두면 아마도 이것이 공개 웹 사이트에 있기를 원할 것입니다.

하지만 MPC나 Windows Media Player와 같은 플레이어에서 문제 없이 정확하게 재생된다는 사실을 보면 Google Chrome이나 HTML 비디오 요소에 문제가 있다는 뜻이 아닌가요? 아니면 지원되지 않는 인코딩 등을 사용하고 있습니까?

답변1

-ss입력 또는 출력 옵션으로 사용되는지 여부에 따라 동작이 변경되며, 종종 속도가 느리지만 출력 옵션으로 사용하면 더 정확할 수 있습니다. 답변 보기ffmpeg는 지정된 기간의 비디오를 천천히 변환합니다.자세한 내용과 예를 보려면

출력 품질을 변경하려면 18-28 사이의 값을 가진 옵션을 source.mp4사용하십시오 (기본값은 23). -crfCRF 섹션을 참조하세요.FFmpeg 및 x264 인코딩 가이드예를 들어.

트리밍 명령을 단순화할 수 있습니다.

ffmpeg -ss 577.92 -i source.mp4 -ss 0 -t 11.98 -c copy -map 0 clip1.mp4

-codec:v copy -codec:a copy으로 교체했습니다 -c copy -map 0. 이전 명령으로 인해 입력에 스트림이 두 개만 있어도 첫 번째 비디오 및 오디오 스트림이 아닌 모든 스트림이 복사됩니다. 다시 인코딩하지 않고는 크기를 조정할 수 없으므로 와 상호 배타적 -codec:v copy이며 입력이 이미 설정된 크기로 크기가 조정되었으므로 필터 옵션을 제거했습니다.

그래도 충분히 정확하지 않다면 다음을 시도해 보세요.

ffmpeg -i source.mp4 -ss 577.92 -t 11.98 -c copy -map 0 clip1.mp4

속도는 느리지만 아마도 더 정확할 것입니다. 이 두 예의 차이점에 대한 설명은 제가 제공한 첫 번째 링크의 답변 링크를 참조하세요.

마지막으로 (ffmpeg 소스의 tools 디렉터리에 위치) 실행하거나 source.mp4옵션 을 사용해야 합니다 . 이렇게 하면 일부 데이터가 파일 시작 부분으로 재배치되어 완전히 다운로드되기 전에 재생을 시작할 수 있습니다.qt-faststart-movflags faststart

관련 정보