다시 인코딩하지 않고 비디오의 프레임 속도를 변경하는 방법


14

MP4 비디오의 프레임 속도를 변경하려고합니다 (120fps GoPro 비디오입니다. 슬로우 모션 효과를 위해 30fps로 재생하고 싶습니다).

나는 이것을 위해 avconv를 사용하고 있습니다 :

avconv -i SourceMovie.mp4 -vf setpts=4.0*PTS -r 30 DestMovie.mp4

기술적으로는 작동하지만 영화를 다시 인코딩합니다. 속도가 느려지는 것 외에도 분명히 품질 문제입니다. 기술적으로 비디오 헤더에 fps를 설정하는 방법이 있어야합니다. 어떻게 변경할 수 있습니까? avconv 이외의 도구도 작동합니다.

답변:


15

MP4Box가 할 수 있습니다.

명령

MP4Box -add SourceMovie.mp4#video -raw 1 -new test

파일을 생성 test하고 test_track1.h264. 지원되는 프레임 속도를 사용하여 mp4 파일을 만들 수 있습니다 (이 예에서는 30).

MP4Box -add test_track1.h264:fps=30 -new DestMovie.mp4

MP4Box는 gpac패키지의 일부 이므로 설치되어 있는지 확인하십시오.


6
정말 간단하지는 않지만 두 단계로 수행해야합니다. 먼저 비디오 스트림을 별도로 원시 ( MP4Box -add source.mp4#video -raw 1 -new test) 로 추출한 다음 MP4로 다시 저장하십시오 ( MP4Box -add test_track1.h264:fps=30 -new dest.mp4). #audio를 통해 오디오 트랙을 추가 할 수도 있습니다.
EboMike

-single첫 번째 명령에 옵션 을 사용하는 것이 좋습니다 . 두 개가 아닌 MP4Box -single 1 -raw 1 SourceMovie.mp4하나의 파일 만 만듭니다 SourceMovie_track1.h264.
diversenok

6

비디오 (컨테이너)의 헤더에서 프레임 속도를 변경해도 비디오 스트림 (또는 오디오 스트림) 자체에는 영향을 미치지 않습니다. 재 인코딩이 유일한 옵션입니다.

비디오 스트림에는 타임 스탬프가 있으며 대부분의 비디오에서 프레임 간 압축으로 인해 프레임이 서로 상호 의존적입니다. 일부 플레이어는 내장 명령이나 무언가로 비디오 속도를 높이거나 늦출 수 있습니다. 컨테이너 명령에서 요청하면 플레이어는 프레임 속도를 즉시 변경할 수 없습니다. 비디오 파일이 사양을 벗어나게되며 (즉, 표준을 따르지 않음) 플레이어의 99.9 %가이를 준수하지 않습니다. 레코딩하지 않고 원하는 것을 수행하는 것은 매우 불가능합니다. 물론 편집의 마지막 단계까지 레코딩을 기다릴 수 있습니다.


1
고마워 톰! 어리석은 질문-왜? 각 프레임에 타임 스탬프가있어 플레이어에게 특정 재생 속도를 강제로 적용합니까? 정확히 같은 프레임을 원하고 다른 속도로 재생하기를 원합니다.
EboMike

2
안녕 마이크, 당신의 질문은 어리석지 않습니다. 솔직히 생각하는 방식은 아주 영리합니다. 나는 당신의 사고 방식을 좋아합니다. 코멘트 박스에 넣기가 너무 길어서 답변에 더 많은 정보를 추가했습니다.

감사! 그것은 유익한 정보입니다. 이제 레코딩과 관련하여 avconv와 같은 작업을 수행하는 가장 좋은 방법은 무엇입니까? 위의 명령 줄을 사용했지만 품질이 좋지 않았습니다. 거의 모든 매크로 블록을 거의 볼 수있었습니다.
EboMike

1
비디오 스트림의 타임 스탬프는 원시 h.264 비트 스트림 자체가 아닌 컨테이너에 저장됩니다. 언제 어떤 프레임이 표시되는지 순서가 아닌 타이밍을 변경하려는 경우에는 코드 변환을하지 않아도됩니다. (더 빠른 하드웨어로 xcode를 수행하는 경우 문제에 더 많은 비트를 던지는 대신 SAME 비트 전송률에서 더 높은 품질을 얻기 위해 느리게 또는 매우 느리게 사전 설정을 사용하고 ABR이 아닌 -crf 18 또는 다른 것을 사용하십시오)
Peter Cordes

1
ffmpeg가 다른 프레임 속도를 출력하는 방법을 알 수 없습니다. ffmpeg에서 원시 .264 비트 스트림을 출력 한 다음 fps 옵션을 h.264 디 먹서에 사용하지 않는 한 mkvmerge / mp4box가 필요합니다 (비트 스트림에 타이밍이 없으므로 -ps 전체 문서). info, just order.)
Peter Cordes

3

파일을 MP4로 유지하지 말고 슬로우 모션으로 재생하려는 경우 MKVmerge GUI 도구를 사용하여 프레임 속도를 쉽게 변경할 수있는 Matroska 컨테이너로 파일을 리 뮤싱 할 수 있습니다. 리 먹싱은 스트림 자체가 아닌 메타 데이터 만 변경하기 때문에 재 인코딩보다 훨씬 낫습니다.

먼저 패키지를 설치하십시오

sudo apt-get install mkvtoolnix-gui

그런 다음 MKVmerge GUI를 시작하십시오. 이 같은 창에 직면하게 될 것입니다

mkvmerge GUI 1

추가 버튼을 누르고 파일을 선택하거나 파일을 "입력 파일"영역으로 끌어다 놓기 만하면됩니다. 이제 비디오에서 비디오 스트림을 선택할 수 있어야합니다. 다른 스트림은 어쨌든 방해가되기 때문에 삭제할 수도 있습니다.

선택하면 하단 탭이 활성화됩니다.

여기에 이미지 설명을 입력하십시오

"특정 작업 형식"으로 변경

여기에 이미지 설명을 입력하십시오

초당 프레임 값을 입력 할 수있는 "FPS"필드가 있음을 알 수 있습니다. 사물을 4 배 느리게하려는 것처럼 보였으므로 초당 약 7 프레임이 목표입니다. "Stretch by"옵션을 사용할 수도 있습니다.

그런 다음 출력 파일 이름을 변경하고 (원하는 경우) "Muxing 시작"을 누를 수 있습니다.

프로그램이 실행되고 파일이 있어야합니다.


2

또한 120FPS 영화를 30FPS로 무손실 속도로 늦추고 싶었습니다. MP4 컨테이너에서 사운드 템포를 변경하고 FPS를 직접 수정하여 스크립트를 작성했습니다. 다음과 같은 도구가 필요합니다.

  1. 오디오 스트림을 변환하는 avconv
  2. 오디오 템포를 늦추는 sondstretch
  3. MP4Box 가 FPS를 변경 하도록하는 gpac

변환에 사용되는 스크립트는 다음과 같습니다.

#!/bin/bash
#########################################
# Lossless slow down from 120 to 30 FPS #
#                                       #
# Use:                                  #
#                                       #
#   slow.bash <mp4_file>                #
#                                       #
#                           #-= OSi =-# #
#########################################


# Prepare basic variables
IN_FILE="$1"
NAME=$(echo "${IN_FILE}" | sed 's/\.[^.]*//')


# Clean up before start
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264" "${NAME}_slow.mp4"


# Slow down sound
avconv -i "${IN_FILE}" -vn -acodec pcm_s16le "${NAME}_.wav"
soundstretch "${NAME}_.wav" "${NAME}.wav" -tempo=-75
avconv -i "${NAME}.wav" -vn -codec:a ac3_fixed -b:a 448k "${NAME}.ac3"


# Change video frame rate and multiplex with slowed sound
MP4Box -add "${IN_FILE}#video" -raw 1 -new "${NAME}"
MP4Box -add "${NAME}_track1.h264:fps=30" -add "${NAME}.ac3" -new "${NAME}_slow.mp4"


# Clean up when we are done
rm -f "${NAME}.ac3" "${NAME}.wav" "${NAME}_.wav" "${NAME}" "${NAME}_track1.h264"

이 스크립트는 _slow 접미사가있는 MP4 사본을 작성합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.