gpt4 book ai didi

使用 FFmpeg 编码的视频播放速度过快

转载 作者:行者123 更新时间:2023-12-04 22:49:40 33 4
gpt4 key购买 nike

我已经搜索了 Google/SO/Zeranoe 结果,并尝试将我发现的所有内容整合到让我的程序正确生成视频,但我仍然无法让它正常工作。

我需要一个好的视频作为引用,所以我跑了:

ffmpeg -t 5 -f dshow -i "video=Logitech HD Pro WebcamC910" CLI.mpg

它生成了一个 5 秒的视频,可以在 VLC 中播放并显示持续时间并正确播放。您可以在此处获取视频: https://drive.google.com/file/d/0B1VGi1Ts7D7TR3c4VUlyM2dIcFk/edit?usp=sharing

然后我用自己的代码生成了一个 5 秒的视频。我试图将其缩减为仅我认为需要记录的内容。您可以在这里找到代码: https://drive.google.com/file/d/0B1VGi1Ts7D7TMnFxSE1HX2FKbEU/edit?usp=sharing

它还生成了一个视频,具有相似的视频质量,但 VLC 不显示视频持续时间并且视频似乎播放太快。我的意思是我在屏幕上看到的东西看起来移动得太快了。您可以在此处找到我的代码生成的视频: https://drive.google.com/file/d/0B1VGi1Ts7D7TSzFGUFZEMHJwQ0U/edit?usp=sharing

即使您单击视频链接,您也可以看到 Google 遇到了我的问题,但 FFmpeg CLI 生成的没有问题。很抱歉在场外发布所有内容,但我不想将我的代码垃圾邮件发送到帖子中,我想提供尽可能多的信息。

我已经看过很多关于此的帖子,但我似乎无法找到明确的解决方案。

编辑:
所以我实现了你的建议,我很确定你的回答解决了时间问题,但现在我在第一次成功调用 encode_video 之前一直得到 20 个非严格单调错误。无论我使用,都会发生这种情况
gFrame->pts = gFrameIndex;

或者
gFrame->pts = av_rescale_q(gFrameIndex, gCodecContext->time_base, gStream->codec->time_base);


ret = avcodec_encode_video2(gCodecContext, &pkt, gFrame, &got_output);
if (ret < 0) {
fprintf(stderr, "Error encoding frame\n");
return false;
}

这似乎与播放期间视频文件开头的视频伪影一致。 gFrameIndex 从 1 开始。

我相信我的网络摄像头在录制开始时会自动对焦,这可能是相关的吗?

我已将生成的 .h264 文件上传到 https://drive.google.com/file/d/0B1VGi1Ts7D7TRjRzbzZZemRaRTA/edit?usp=sharing和我最近的代码 https://drive.google.com/file/d/0B1VGi1Ts7D7TbmlyYncxYzRQUTA/edit?usp=sharing .

我真的很感激帮助。遗憾的是,我不能直接在我的软件中使用 FFmpeg CLI,所以我必须使用该库。除非你能提出更好的选择,否则我将不得不继续使用它。

最佳答案

通常在您调用 avcodec_encode_video2() 之前您设置帧的时间戳,例如:

gFrame->pts = gFrameIndex;
gFrameIndex每个编码帧增加 1,这在您的情况下应该是正确的,因为您的 time_base是 1/30,每帧代表 1/30 秒的持续时间。

那么这里要小心:
  if (pkt.pts != AV_NOPTS_VALUE) pkt.pts = av_rescale_q(gCodecContext->coded_frame->pts, gCodecContext->time_base, gStream->time_base);
if (pkt.dts != AV_NOPTS_VALUE) pkt.dts = av_rescale_q(gFrameIndex, gCodecContext->time_base, gStream->time_base);

您是否因为使用 libx264 而遇到问题?编码?我注意到在这种情况下,您必须在调用 avcodec_encode_video2() 之前和之后重新调整时间戳。 ,例如:
gFrame->pts = av_rescale_q(gFrameIndex, gCodecContext->time_base, gStream->codec->time_base);
[...]
avcodec_encode_video2()
[...]
pkt.pts = av_rescale_q(pkt.pts, gStream->codec->time_base, gStream->time_base);
pkt.dts = av_rescale_q(pkt.dts, gStream->codec->time_base, gStream->time_base);

这是因为ffmpeg接口(interface)与 libx264质量不是很高。

您的网络摄像头是否丢帧?如果是这样,那么您需要为帧提供真正的时间戳。创建一个函数,返回自开始捕获以来耗时(以毫秒为单位)(整数)。然后设置 time_base{1,1000}并设置 gFrame->pts到你的函数的返回值。但要小心:你不能有一个 <= 前一个时间戳的时间戳。因此,如果您一次获得多个帧,则需要丢帧(或编写另一种机制来处理这种情况)。顺便说一句,这一切都在 ffmpeg 中为您完成。 CLI 程序,这就是为什么很少有人尝试使用 ffmpeg 库...

关于使用 FFmpeg 编码的视频播放速度过快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23219464/

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