使用FFmpeg编码新视频和音频时计算PTS和DTS

3

我将音频与H.264视频编码成一个MP4文件。

如何正确计算AVPacket和AVFrame的PTS和DTS,以用于视频和音频?

我从我的资源中生成新的视频帧和新的音频。没有原始的PTS/DTS信息。我知道需要使用的帧速率(时间基准)。

1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2
假设您的帧速率是恒定的,并正确设置了流时间基准。从零(0)开始启动两个pts。每帧音频pts将增加“每帧样本数”。“每帧样本数”通常为音频采样率/帧速率(即48000/60 = 800)。 对于视频,情况有所不同,但也比较简单。每帧视频pts将以相同的“视频帧持续时间”增加。使用此备忘单计算持续时间:
FPS     Frame duration
23.98   2002
24.00   2000
25.00   2000
29.97   2002
30.00   2000
50.00   1000
59.94   1001
60.00   1000

是的,这些有点不太正规,但是可以起作用。


感谢您的回复,遗憾的是这对我不起作用。我很快就会收到错误信息: “应用程序在流0中向复用器提供了无效的、非单调递增的dts”对于视频,我设置了time_base为1/30,对于音频则为1/44100。我编码原始视频/音频数据。 您知道有没有任何完整的混合示例代码? - Igor
这个“应用程序在流X中向复用器提供了无效的、非单调递增的DTS”错误仅会在下一个PTS或DTS等于或低于上一个时发生。它应该像我解释的那样递增。我忘记提到,为帧设置PTS和DTS相同的值。我会寻找示例。 - the kamilz
这个简单的项目涉及到pts实现的一些想法:https://github.com/kmsquire/split_video - the kamilz
再次感谢您的建议!我会检查那个示例代码。我在我的代码中找到了至少一个关键错误。在调用av_interleaved_write_frame()之前,我没有设置AVPacket.steam_index。 似乎早期所有我的视频/音频AVPacets都被添加到一个视频流(0)中。 现在复用工作正常,我看到两个流 - 视频和音频。 - Igor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,