【发布时间】:2018-08-14 16:00:55
【问题描述】:
我只是想从缓冲区中保存相同的视频帧,在那里我正确保存了帧的位图帧和时间戳。
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));
但在视觉工作室(不是第一帧)我得到这个错误: Accord.Video.VideoException: '写入视频帧时出错。错误 -22:参数无效。有关详细信息,请参阅控制台输出。'
在控制台上: 应用程序在流 0 中向复用器提供了无效的、非单调递增的 dts:512 >= 512
我不知道这是什么原因,因为在调试时所有值似乎都是正确的。 (如果您需要更多代码,请告诉我)
【问题讨论】:
-
我假设您正确设置了编解码器/流
time_base(我在这里看不到)。所以你的问题就在这里endoFrameBuffer.getframetime(endoFrameBuffer.Tail)让我们看看代码 -
endoFrameBuffer 只是一个带有位图图像和正确时间跨度的 RingBuffer :
public TimeSpan getframetime(int index) { return _timeBuffer[index]; } -
设置值我只是添加一个新元素,如下所示:
endoFrameBuffer.Enqueue(eventArgs.Frame,DateTime.Now - _firstFrameTime.Value);当 newframe 事件被触发时。然后在另一个线程上,我只是从 RingBuffer 记录每一帧。 -
我直接问你,
fps那个视频流是什么(因为pts=512对我来说很不寻常)。getFrameTime方法是否返回pts值?。 -
视频流大约是 aprox。 30 帧/秒。 getFrameTime 返回 TimeSpan(帧与接收到的第一帧之间的时间差)
标签: c# ffmpeg accord.net