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


14

我正在尝试更改MP4视频的帧速率(这是120fps的GoPro视频,我想以30fps的速度播放慢动作效果)。

我为此使用avconv:

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

从技术上讲,这是可行的,但它会重新编码电影。除了速度慢之外,这显然是质量问题。从技术上讲,应该有一种方法可以仅在视频标题中设置fps,如何更改呢?(除了avconv以外,任何其他工具都可以使用。)

Answers:


15

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包装的一部分,因此请确保已安装。


6
这确实不是一件容易的事,但是我明白了-您需要分两步完成。首先分别将视频流提取为原始视频(MP4Box -add source.mp4#video -raw 1 -new test),然后再次将其另存为MP4(MP4Box -add test_track1.h264:fps=30 -new dest.mp4)。您也可以在此处添加音频轨道(通过#audio)。
EboMike 2013年

最好-single在第一个命令中使用option。MP4Box -single 1 -raw 1 SourceMovie.mp4仅创建一个文件,SourceMovie_track1.h264而不是两个。
–divernok

6

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

视频流具有时间戳,在大多数视频中,帧之间由于帧间压缩而相互依赖。有些播放器可以加快和减慢视频播放速度,但不能通过嵌入式命令或其他方式来加快播放速度。当container命令要求时,任何玩家都无法即时更改帧速率。视频文件最终将超出规范(即不遵循标准),并且99.9%的播放器将拒绝遵守该文件。不进行编码就完全不可能做您想做的事情。当然,您可以等待重新编码,直到编辑的最后一步。


1
谢谢你!愚蠢的问题-为什么?每帧都有时间戳吗,迫使播放器强制执行一定的播放速度?我想要完全相同的帧,只希望它们以不同的速率播放。
EboMike

2
嗨,迈克,坦率地说,您的问题并不愚蠢。我喜欢你的思维方式。我在答案中添加了更多信息,因为将其放入评论框太长了。
2013年

谢谢!那是非常有益的。现在是重新编码-使用avconv之类的最佳方式是什么?我使用了上面的命令行,但这导致了可怕的质量-我几乎可以看到每个宏块。
EboMike

1
我认为,视频流中的时间戳记存储在容器中,而不是原始的h.264比特流本身。只要您只想更改显示帧的时间(而不是显示顺序),就无需转码,只需重新分配即可。(而且,如果您执行xcode,则使用速度更快的硬件,则可以使用-preset速度更慢或非常慢,以相同的比特率获得更高的质量,而不仅仅是在问题上投入更多的比特。并且使用-crf 18之类的东西,而不是ABR)
彼得·科德斯(Peter Cordes)2014年

1
我不知道如何使ffmpeg输出不同的帧率。看起来mkvmerge / mp4box是必需的,除非您可以让ffmpeg输出原始的.264比特流,然后对h.264多路分配器使用fps选项(-h完整记录了它的内容,因为比特流没有计时信息,只需订购。)
Peter Cordes 2014年

3

如果您的主要意图是慢动作播放而不是将文件保留为MP4,则可以使用MKVmerge GUI工具将其重新混合到Matroska容器中,该容器可以轻松更改帧率。重混合比重新编码好得多,因为它仅更改元数据,而不更改流本身。

首先安装软件包

sudo apt-get install mkvtoolnix-gui

然后,您启动MKVmerge GUI。您将面对这样的一个窗口

mkvmerge gui 1

只需按添加按钮并选择您的文件,甚至只需将文件拖放到“输入文件”区域即可。此时,您应该可以选择视频中的视频流。您也可以删除其他流,因为它们总是会妨碍您的操作。

选择之后,您应该会看到底部的选项卡处于活动状态:

在此处输入图片说明

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

在此处输入图片说明

您会看到有一个“ FPS”字段,您可以在其中输入每秒的帧数。您似乎打算减慢速度四倍,因此大约每秒7帧是您的目标。您也可以使用“ Stretch by”选项。

之后,您可以更改输出文件的名称(如果需要),然后按“开始混合”。

该程序将运行,您应该拥有文件。


2

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

  1. avconv转换音频流
  2. sondstretch减慢音频速度
  3. gpac获取MP4Box更改FPS

用于转换的脚本在这里:

#!/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的副本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.