1

我正在将 H264 帧与来自 RTP 流的 alaw 音频帧混合,但我在为 mkv 容器设置 fps 时遇到了一些问题。

对于 AVPacket::pts,我使用的是计算出的演示时间(来自 RTCP SR 报告),我将它们重新缩放如下(我假设音频完全相同):

pkt.pts = av_rescale_q(s_video_sync.fSyncTime.tv_sec * 1000000 + s_video_sync.fSyncTime.tv_usec, 
av_encode_codec_ctx->time_base, video_st->time_base); 
  • 最后的时间戳以微秒为单位(第一个参数),理论上它是 NTP 派生的。
  • av_encode_codec_ctx->time_base设置为 {1,fps}fps 取决于流的位置,比方说5
  • video_st->time_base是自动到的{1,1000}(我认为这是由 mkv 容器强制执行的)

我认为这是应该设置为重新缩放功能的内容(至少这是示例显示的内容),但是 ffprobe 显示奇怪的持续时间读数,并且 fps 设置为 1k ......而且视频播放很奇怪。

我的问题是我应该如何处理这个问题?我应该重新调整时间戳以从第一个数据包的 0 开始计数,还是我弄乱了两个不同的时域,因此 muxer 无法弄清楚该怎么做?

EDIT1
我发现由于时间戳以微秒为单位(而且我没有编码),我应该将{1,1000000}其用作 pts calc 的时基,而不是编解码器的时基。现在至少持续时间还可以,音频播放流畅,但视频“断断续续”,视频中的时间戳不会平滑增加……而且 fps 仍然是 1k

EDIT2 似乎在手动设置之后(可能一开始就应该这样设置)设置以下内容:

video_st->avg_frame_rate = (AVRational){ 90000, 90000/u8fps };  
av_stream_set_r_frame_rate(video_st, (AVRational){ 90000, 90000/u8fps });

其中u8fps是假定的每秒帧90000速率, 是视频的标准采样率(90kHz 滴答声) 视频播放流畅。

问候,帕维尔。

4

0 回答 0