当前位置: 首页 > 知识库问答 >
问题:

ffmpeg输出一个25fps视频的第一帧仅显示1ms

江建明
2023-03-14

我正在使用ffmpeg将视频按帧分割。对于25fps的视频,我的期望是,它将显示0帧40毫秒,然后显示1帧40毫秒,等等。然而,当我使用ffmepg分析视频时,这不是我得到的结果。

我使用以下命令从视频中提取帧:

ffmpeg -i original.mp4 -ss 00:00:00.000 -vframes 1 0.000.png
ffmpeg -i original.mp4 -ss 00:00:00.001 -vframes 1 0.001.png
ffmpeg -i original.mp4 -ss 00:00:00.040 -vframes 1 0.040.png
ffmpeg -i original.mp4 -ss 00:00:00.041 -vframes 1 0.041.png

在这种情况下,我希望0.000.png0.001.png是相同的帧,但是生成的pngs是不同的。然而,另一方面,0.001.png0.040.png是相同的帧,而0.040.png0.041.png是不同的帧。似乎0.000.png的帧只显示1ms。我在多个不同的视频上测试过这个,结果一致。有人能解释为什么这是或者为什么我的期望可能不正确吗?

作为旁注,当我将同一视频加载到浏览器中的HTML5视频标记中时,当我播放视频时,第一帧显示64毫秒,所有其他帧显示40毫秒。我可以通过比较以下命令的帧来测试这一点:

player.currentTime = 0
player.currentTime = .063 // same frame as 0
player.currentTime = .064 // different frame than .063
player.currentTime = .103 // same frame as .064
player.currentTime = .104 // different frame than .103

这也出乎意料,使得ffmpeg和html5视频之间的视频帧/时间匹配变得更加烦人。有人知道这里发生了什么吗?

如果有帮助,以下是视频中的元数据:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'original.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.101
  Duration: 01:36:16.20, start: 0.000000, bitrate: 2301 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2200 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

共有1个答案

朱锐
2023-03-14

-ss将在指定的时间戳处或之后匹配第一帧。

至于第一帧持续时间和后续视频帧时间戳,您的文件有一个AAC音频曲目,它有一个启动样本,看起来浏览器/播放器不会跳过启动样本,并偏移视频时间戳以保持同步。

 类似资料:
  • 问题内容: 我正在创建一个单页应用程序,后端使用Golang,前端使用javascript。我想找到一种方法,以使用Golang获取视频的第一帧。 首先,我将一个.mp4视频文件上传到服务器。它保存在服务器上。 有没有一种方法可以使用Golang获取此视频的第一帧?应该可以在前端使用Javascript来做到这一点,但我认为这不是解决此问题的正确方法。 我不知道如何使用Golang来实现它,也没有

  • 我的应用程序有一个片段,播放一秒钟长的视频。播放完视频后,用户必须按下一个按钮,然后应该播放一个新的视频。在播放第二个视频之前,my main activity加载、创建一个新片段并创建新的Exoplayer实例。 我第一次播放视频时,一切都按预期进行。然而,如果我想播放第二个视频,它将显示第一个视频最后一帧的冻结图像,并播放第二个视频的声音。这个bug不出现在Android8(API Level

  • 我试图转码一个单一的视频文件与1个视频流和几个音频流到文件具有相同的视频流在不同的比特率/大小与正确的填充在同一时间。 我使用的命令是: 实际上,对同一个文件进行几个比特率的代码转换是可能的吗?

  • 我想让应用程序逐帧播放功能。我想这是不可能与标准的Android工具。我尝试了VideoView和search kTo(当前的1000/帧率)方法,但它不起作用(我想它不会在暂停的视频上寻找)。我的问题是:我需要学习和使用什么来使它成为可能,什么工具和/或库?我是Android初学者,我没有工作的视频渲染早,所以我的知识,这是真的很低。

  • 问题就在这里:我创建了世界上最简单的RecyclerView,但它只显示第一个项目。我不明白为什么。谢谢你的帮助。 item_layout.xml mainactivity.java

  • 使用FFmpeg,我试图对一个输入视频进行一些过滤操作,以缩放它(out1),缩放和修剪它(out2)。这是我正在使用的命令: 有人能给我个提示吗? --编辑--这是第一个ffmpeg命令的输出: