ffmpeg로 비디오 (+ 오디오)를 정확하게 자르기


10

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

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

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도움이되지 않았습니다.

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

파일은 문제없이 외부에서 재생할 수 있지만 html5 비디오 요소에로드하여 재생할 때 비디오의 마지막 부분 (오디오가 정상)이 정지됩니다. 얼어 붙은 마지막 부분은 1 초 미만입니다.

다른 비디오 인코더로 시도해야합니까? libx264의 가장 좋은 대안은 무엇입니까? 명심하십시오 나는 아마 이것이 공개 웹 사이트에 있기를 원할 것입니다.

그러나 MPC 또는 Windows Media Player와 같은 플레이어에서 문제없이 정확하게 재생된다는 사실이 Chrome 또는 HTML 비디오 요소에 문제가 있다고 제안하는 것은 아닙니다. 또는 지원되지 않는 인코딩이나 다른 것을 사용하고 있습니까?


이것은 키 프레임의 타이밍과 관련이있을 수 있습니다. 어쨌든 SuperUser.com으로 이동해야합니다.
브래드

ffmpeg는 어떤 시점에서도 비디오를자를 수 없으며 키 프레임 만자를 수 있습니다. 이런 이유로 오디오는 거의 정확하지만 비디오는 정확하지 않습니다.

직접 움직여도 되나요? 00 : 나는 -force_key_frames 00와 소스 파일에 키 프레임을 추가하려고합니다 00.2
피트 Oakey에

답변:


9

-ss입력 또는 출력 옵션으로 사용되는지에 따라 변경 되는 동작으로 , 느리지 만 출력 옵션으로 사용하면 더 정확할 수 있습니다. 자세한 내용과 예 는 ffmpeg에서 지정된 시간의 비디오를 천천히 변환 하는 방법에 대한 답변을 참조하십시오 .

출력 품질을 변경하려면 18-28 사이의 값으로 옵션 을 source.mp4사용하십시오 -crf(23이 기본값). 예제 는 FFmpeg 및 x264 인코딩 안내서 의 CRF 섹션을 참조하십시오 .

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

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옵션을 사용해야합니다 . 이렇게하면 일부 데이터가 파일의 시작 부분으로 이동하여 완전히 다운로드되기 전에 재생을 시작할 수 있습니다.


팁은 +1이지만 ffmpeg -i source.mp4 -ss 577.92 -t 011.980 -c copy -map 0 clip1.mp4를 시도했지만 첫 번째 부분 (거의 1 초)과 마지막 부분 (1 / 4 분의 1) 비디오가 누락되었지만 오디오는 정상입니다.
Pete Oakey

@PeteOakey 비트 스트림 복사없이 절단을 시도했지만 실제 재 인코딩을 했습니까?
slhck

비트 스트림 복사없이 시도했는데 결과가 내 질문에 추가되었습니다.
Pete Oakey

3
-ss입력 옵션 대신 출력 옵션으로 사용하면 문제가 해결되었습니다. 첫 번째 비디오 프레임은 출력 비디오에서 약 1 초였으며 그 이전에는 오디오 만 ffprobe -show_frames있었습니다 (또한로 확인 ). 이동 -ss-i프레임 0에서 시작하여 오디오 및 비디오 프레임이 출력됩니다.
CodeManX
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.