如何在不重新编码的情况下更改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
创建文件test
和test_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。 你会遇到像这样的窗户
只需按添加按钮并选择您的文件,甚至只需将文件拖放到“输入文件”区域即可。 此时,您应该可以在video中选择video流。 你也可以删除其他流,因为它们无论如何都会受到阻碍。
选择它后,您应该会看到底部标签变为活动状态:
更改为“格式化特定操作”
您可以看到有一个字段“FPS”,您可以在其中输入每秒帧数的值。 看起来你计划将速度降低四倍,所以每秒大约7帧就是你的目标。 您也可以使用“Stretch by”选项。
之后,您只需更改输出文件的名称(如果需要),然后按“启动多路复用”。
该程序将运行,你应该有你的文件。
我还希望将我的120 FPS电影无损地减速到30 FPS。 我通过改变声音节奏并直接在MP4容器中修改FPS来制作脚本。 需要以下工具:
- avconv转换音频流
- sondstretch减慢音频节奏
- gpac让MP4Box改变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的副本。