如何在不重新编码的情况下更改video的帧速率

我正在尝试改变MP4video的帧速率(这是一个120fps的GoProvideo,我希望以30fps的速度播放它以获得慢动作效果)。

我正在使用avconv:

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

这在技术上有效,但它重新编码了电影。 除了速度慢之外,这显然是一个质量问题。 从技术上讲,应该有一种方法只在video标题中设置fps,我该如何改变? (avconv以外的任何工具也可以。)

MP4Box可以做到。

命令

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

创建文件testtest_track1.h264 。 您现在可以创建一个mp4文件,其中包含您想要的任何支持帧率(在本例中为30):

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

MP4Box是gpac包的一部分,因此请确保已安装。

更改video(容器)标题中的帧速率对video流(或音频流)本身没有影响。 重新编码是唯一的选择。

video流具有时间戳,并且在大多数video中,由于帧间压缩,帧彼此相互依赖。 有些玩家可以加速和减慢video速度,但不能通过嵌入式命令或其他东西。 当containercommand要求时,没有玩家可以动态改变帧速率。 video文件最终将超出规范(即不符合标准),99.9%的玩家将拒绝遵守该标准。 没有重新编码就不可能做你想做的事。 当然,您可以等到重新编码,直到编辑的最后一步。

如果您的主要目的是以慢动作播放,而不是将文件保存为MP4,则可以使用MKVmerge GUI工具将其重新转换为可轻松更改帧速率的Matroska容器。 Remuxing比重新编码要好得多,因为它只会更改元数据,而不会更改流本身。

首先安装包

 sudo apt-get install mkvtoolnix-gui 

然后启动MKVmerge GUI。 你会遇到像这样的窗户

mkvmerge gui 1

只需按添加按钮并选择您的文件,甚至只需将文件拖放到“输入文件”区域即可。 此时,您应该可以在video中选择video流。 你也可以删除其他流,因为它们无论如何都会受到阻碍。

选择它后,您应该会看到底部标签变为活动状态:

在此处输入图像描述

更改为“格式化特定操作”

在此处输入图像描述

您可以看到有一个字段“FPS”,您可以在其中输入每秒帧数的值。 看起来你计划将速度降低四倍,所以每秒大约7帧就是你的目标。 您也可以使用“Stretch by”选项。

之后,您只需更改输出文件的名称(如果需要),然后按“启动多路复用”。

该程序将运行,你应该有你的文件。

我还希望将我的120 FPS电影无损地减速到30 FPS。 我通过改变声音节奏并直接在MP4容器中修改FPS来制作脚本。 需要以下工具:

  1. avconv转换音频流
  2. sondstretch减慢音频节奏
  3. gpacMP4Box改变FPS

用于转换的脚本在这里:

 #!/bin/bash ######################################### # Lossless slow down from 120 to 30 FPS # # # # Use: # # # # slow.bash  # # # # #-= 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的副本。