gpt4 book ai didi

c# - 非单调增加 dts 到流中的复用器

转载 作者:行者123 更新时间:2023-12-04 22:59:38 32 4
gpt4 key购买 nike

我只是想从缓冲区中保存相同的视频帧,在那里我正确保存了帧的位图帧和时间戳。

writer1 = new VideoFileWriter();
this.writer1.Width = this.videoSourceEndo.VideoResolution.FrameSize.Width;
this.writer1.Height = this.videoSourceEndo.VideoResolution.FrameSize.Height;
this.writer1.VideoCodec = VideoCodec.H264;
this.writer1.BitRate = (this.videoSourceEndo.VideoResolution.FrameSize.Height * this.videoSourceEndo.VideoResolution.FrameSize.Width * 30);

this.writer1.VideoOptions["preset"] = "superfast";
this.writer1.VideoOptions["tune"] = "zerolatency";

writer1.Open("test_HDMI.mp4");

(...)
writer1.WriteVideoFrame(endoFrameBuffer[endoFrameBuffer.Tail],endoFrameBuffer.getframetime(endoFrameBuffer.Tail));

但是在 Visual Studio (不是第一帧)我收到这个错误:
Accord.Video.VideoException: '写入视频帧时出错。错误 -22:参数无效。有关更多详细信息,请参见控制台输出。

在控制台上:
应用程序在流 0 中向复用器提供了无效的、非单调递增的 dts:512 >= 512

我不知道原因,因为在调试时所有值似乎都是正确的。
(如果您需要更多代码,请告诉我)

最佳答案

好的,我会放在这里。
第一件事在哪里 VideoStream->time_base: 1/15360来自,这应该是 30fps 的 1000/30000 或 29.97 fps 的 1001/30000。

第二个问题是您的 pts/dts 和帧持续时间计算。如您所见,最后两个 pts/dts 值相同。

对于数据包持续时间(我假设 fps 通常应该是恒定的)使用这些预先计算的值(或与您的作为引用检查):

fps     duration (same unit as AVPacket::duration)
23.98 2086
24.00 2000
25.00 2000
29.97 2068
30.00 2000
50.00 1000
59.94 1016
60.00 1000

至于手动计算pts/dts:
这是我使用的 C++ 函数:
static void write_video_pts(EncoderContext *ectx, AVPacket *pkt)
{
pkt->pts = ectx->video_pts; /* this is to keep next pts value, same unit as AVPacket::pts */
ectx->video_pts += ectx->frame_duration; /* check above table for ectx->frame_duration value */
pkt->dts = pkt->pts;
pkt->duration = ectx->frame_duration; /* check above table for ectx->frame_duration value */
pkt->stream_index = ectx->VideoStream->index; /* AVStream */
}

当从 RAW 源手动编码时,这些绝对有效,比如你的。当然不是为了转码。

希望有帮助。

关于c# - 非单调增加 dts 到流中的复用器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49136872/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com