已过时 - 关键帧之间的 FFMPEG 解码伪影

2023-12-12

将问题标记为过时,因为使用已弃用的 avcodec_decode_video2


I'm currently experiencing artifacts when decoding video using ffmpegs api. On what I would assume to be intermediate frames, artifacts build slowly only from active movement in the frame. These artifacts build for 50-100 frames until I assume a keyframe resets them. Frames are then decoded correctly and the artifacts proceed to build again.

困扰我的一件事是我有一些 30fps(h264) 的视频样本可以正常工作,但我所有的 60fps 视频(h264) 都遇到这个问题。

我目前没有足够的声誉来发布图像,所以希望这个链接能够工作。https://i.stack.imgur.com/1bv4X.jpg

int numBytes;
int frameFinished;
AVFrame* decodedRawFrame;
AVFrame* rgbFrame;

    //Enum class for decoding results, used to break decode loop when a frame is gathered
DecodeResult retResult = DecodeResult::Fail;

decodedRawFrame = av_frame_alloc();
rgbFrame = av_frame_alloc();
if (!decodedRawFrame) {
    fprintf(stderr, "Could not allocate video frame\n");
    return DecodeResult::Fail;
}

numBytes = avpicture_get_size(PIX_FMT_RGBA, mCodecCtx->width,mCodecCtx->height);
uint8_t* buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

avpicture_fill((AVPicture *) rgbFrame, buffer, PIX_FMT_RGBA, mCodecCtx->width, mCodecCtx->height);

AVPacket packet;

while(av_read_frame(mFormatCtx, &packet) >= 0 && retResult != DecodeResult::Success)
{
    // Is this a packet from the video stream?
    if (packet.stream_index == mVideoStreamIndex)
    {
        // Decode video frame
        int decodeValue = avcodec_decode_video2(mCodecCtx, decodedRawFrame, &frameFinished, &packet);

        // Did we get a video frame?
        if (frameFinished)// && rgbFrame->pict_type != AV_PICTURE_TYPE_NONE )
        {
            // Convert the image from its native format to RGB
            int SwsFlags = SWS_BILINEAR;
            // Accurate round clears up a problem where the start
                            // of videos have green bars on them
            SwsFlags |= SWS_ACCURATE_RND;
            struct SwsContext *ctx = sws_getCachedContext(NULL, mCodecCtx->width, mCodecCtx->height, mCodecCtx->pix_fmt, mCodecCtx->width, mCodecCtx->height, 
                PIX_FMT_RGBA, SwsFlags, NULL, NULL, NULL);
            sws_scale(ctx, decodedRawFrame->data, decodedRawFrame->linesize, 0, mCodecCtx->height, rgbFrame->data, rgbFrame->linesize);
            
            //if(count%5 == 0 && count < 105)
            //  DebugSavePPMImage(rgbFrame, mCodecCtx->width, mCodecCtx->height, count);
            
            ++count;
            // Viewable frame is a struct to hold buffer and frame together in a queue
            ViewableFrame frame;
            frame.buffer = buffer;
            frame.frame = rgbFrame;
            mFrameQueue.push(frame);
            
            
            retResult = DecodeResult::Success;
                        
            sws_freeContext(ctx);
        }
    }
    
    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
}

// Check for end of file leftover frames
if(retResult != DecodeResult::Success)
{
    int result = av_read_frame(mFormatCtx, &packet);
    if(result < 0)
        isEoF = true;
    av_free_packet(&packet); 
}   

// Free the YUV frame
av_frame_free(&decodedRawFrame);

我正在尝试构建一个解码帧队列,然后根据需要使用和释放该队列。我对帧的分离是否导致中间帧解码不正确?一旦我成功收集了一帧,我也会打破解码循环(解码::成功,我见过的大多数例子都倾向于循环整个视频。

所有编解码器连接、视频流信息和格式上下文的设置与主函数中所示完全相同https://github.com/chelyaev/ffmpeg-tutorial/blob/master/tutorial01.c

任何建议将不胜感激。


如果有人发现自己处于类似的位置,供参考。显然,对于某些旧版本的 FFMPEG,使用 sws_scale 转换图像而不更改最终帧的实际尺寸时存在问题。如果您使用以下方法为 SwsContext 创建一个标志:

int SwsFlags = SWS_BILINEAR; //任何你想要的 SwsFlags |= SWS_ACCURATE_RND; // 在底层强制 ffmpeg 使用与缩放相同的逻辑

SWS_ACCURATE_RND 会带来性能损失,但对于常规视频来说可能并不那么明显。这将消除沿纹理边缘的绿色飞溅或绿色条(如果存在)。

我要感谢 Multimedia Mike 和 George Y,他们的观点也是正确的,因为我解码帧的方式没有正确保留数据包,这就是导致从以前的帧构建视频伪影的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

已过时 - 关键帧之间的 FFMPEG 解码伪影 的相关文章

  • C++ Singleton 类 getInstance (作为 java)[重复]

    这个问题在这里已经有答案了 可能的重复 谁能给我提供一份 C 中的 Singleton 示例吗 https stackoverflow com questions 270947 can any one provide me a sample
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 错误 C2064:术语不计算为采用 1 个参数的函数

    class Student bool Graduate return m bGraduate class School vector
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • ResourceDictionary 源中的 Uri 语法(通用 Windows 平台)

    我正在迁移我的Windows 8 1项目到Windows 10 通用 Windows 平台 这时我被拦住了ResourceDictionary改变在UWP 为了简单起见 我有包含 2 个项目的 Windows 8 1 解决方案 App pr
  • 使用成员函数作为 std::shared_ptr 的自定义删除器时出现问题

    我正在尝试弄清楚如何将 std shared ptr 与自定义删除器一起使用 具体来说 我将其与 SDL Surface 一起使用 如下所示 std shared ptr
  • 锁定文件的一个块

    我有一个大小为 192k 的文件 我想锁定文件的中间部分 例如 我想用 c 锁定文件的 64k 128k 知道如何锁定文件的那部分吗 你需要使用锁定文件Ex http msdn microsoft com en us library win
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 散列 hash_hmac 时,Convert.ToChar(0) 散列结果与 PHP 中的 chr(0) 不同的字符串

    我在 PHP 中有一个字符串 它被转换为字节数组并进行哈希处理 转换为字节数组的字符串如下所示 G 字符 0 便便 我需要 C 中的等效字节数组 这样我才能得到相同的哈希值 编辑 这是完整的问题 生成的哈希值不同 PHP api secre
  • 如何从停止的地方开始播放视频

    我正在使用 VideoView 来播放视频 如果我退出应用程序 在返回应用程序 即在 onResume 中 时 它应该从停止的位置播放视频 要获取当前进度 在 onPause 中检查 long progress mVideoView get
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • Swagger 对象数组

    我在 swagger 方面遇到了一些问题 我在 yaml 文件中以这种方式描述了一组对象 地址 Address properties street type string city type string state type string
  • Bootstrap 3 使用 Javascript 在页面加载时打开下拉菜单

    我似乎无法在页面加载时打开此下拉菜单 有人可以帮忙吗 Bootrap 3 的文档在这里 http getbootstrap com javascript dropdowns 我尝试过 但似乎不起作用 myDropdown dropdown
  • 用于 Javascript 的 .tiff 库

    有没有类似的图书馆画布2图像 请查看createBMP函数 在JavaScript 浏览器或nodejs 中制作 tiff 本机浏览器对 tiff 文件的支持仍然很差 维基百科对浏览器有很好的概述图片格式支持 话虽如此 由于 tiff 图像
  • (未知):#2514:获取脚本时发生未知错误。 [服务人员]

    这是控制台上的内容 unknown 2514 An unknown error occurred when fetching the script Service Workers 当服务工作人员接管或跳过等待并且我在网络关闭的情况下重新加载
  • GnuPlot 中的线图,其中线宽是我的数据文件中的第三列?

    我有一个包含三列的数据文件 1 1 0 1 2 1 5 2 3 0 0 3 4 1 2 2 5 5 1 0 1 6 1 1 5 其中第一列是我的 X 值 第二列是我的 Y 值 第三列是线宽 我希望根据第三列线宽绘制每个线段 I tried
  • 升级到Xcode 10后出现问题:找不到构建输入文件

    我昨晚将 Xcode SDK 升级到版本 10 然后发现无法构建 我收到此错误 找不到构建输入文件 Users call01 Library Developer Xcode DerivedData Comp Lite Apps gytvmo
  • 如何在Python中使用turtle模块播放GIF?

    我想让 GIF 在海龟屏幕上播放 但它只显示静态图像 请解决这个问题 任何帮助将不胜感激 这是我的代码 import turtle import os resources bgpic r C Users intel Desktop xBDT
  • 以编程方式检测 iPhone 中的 Sim 卡是否可用

    您好 我正在使用 SMSComposer 想要从地址簿中向联系人发送短信 我想检测我的 iPhone 中是否有 SIM 卡 我有什么办法可以达到这个目的吗 我尝试了 REachability Classes 但它为您提供了有关 WWAN 和
  • 使用自定义选择颜色和边框创建分组 UITableviewCell

    我目前正在编写一个应用程序 它在分组表视图中使用不同的选择颜色 就边界而言 这非常有效 我可以使用这篇文章中的代码更改选择颜色 如何自定义分组表视图单元格的背景 边框颜色 BUT我还想在苹果使用的单元格周围添加漂亮的边框 我该如何使用这个边
  • 无法安装 HTTPBuilder

    我正在尝试安装HTTPBuilder像这样 Grab group org codehaus groovy modules http builder module http builder version 0 7 2 但是 我收到此错误 ja
  • 如何从像素缓冲区创建 Win32 HBITMAP

    我尝试从像素缓冲区创建 HBITMAP 并显示它 这是我创建 HBITMAP 的代码 char buffer 640 480 3 memset buffer 255 640 480 3 BITMAPINFO bm sizeof BITMAP
  • Django 查询集匹配所有相关对象

    假设我有一个从 Coconut 到 Swallow 的外键 即 一只燕子携带了许多椰子 但每个椰子只被一只燕子携带 现在假设我有一个从 husk segment 到 Coconut 的外键 现在 我有一个 husk segments 列表
  • 整数太大[重复]

    这个问题在这里已经有答案了 嗨 我无法理解为什么这不起作用 if Long parseLong morse 4545454545 System out println 2 其中莫尔斯只是一串数字 问题是它说整数太大 4545454545 但
  • 如何从 CSV 中提取命名列?

    我有一个包含大约 50 列的 csv 文件 但我只需要其中大约 10 列 我希望能够从该 csv 文件中提取所需的列到新的 csv 文件中 这篇文章的最佳答案如何删除 CSV 文件中的列 看起来它会完全满足我的需要 但这是我每天都需要做的事
  • 使用 GET 的 MVC AttributeRouting - 返回 405 - 不允许的方法

    我刚刚在研究一种新的控制器操作方法 我有点困惑为什么会看到 405 我已经在我的 API 上定义了几个 GET 属性方法 它们都按预期运行 举个例子 这工作得很好 GET entries page JsonExceptionFilter p
  • 与绘图线一起创建标签

    我问了一个有关自定义小部件的问题 但对我是否需要它以及应该如何进行感到困惑 我目前有这门课 public class GUIEdge public Node node1 public Node node2 public int weight
  • 从 GCP 连接到 Azure SQL 时出现 NoClassDefFoundError com/microsoft/aad/adal4j/AuthenticationException

    我的 Spark 项目位于 GCP 中的 data proc 上 并在 Spark 提交上运行驱动程序 当我尝试连接到 Azure SQL DB 时 它抛出以下异常 20 39 15 DOCKER Exception in thread m
  • 为什么无序流比有序流更快?

    我正在阅读 Richard Warburton 所著的 Java 8 书籍 并得出以下结论 某些操作在有序流上的成本更高 这个问题可以 可以通过消除排序来解决 为此 请调用流的unordered方法 我对此感到非常困惑 假设我们有Strea
  • Pandas 反向分割函数

    我有一个 Pandas Dataframe 其中有一列 如下所示 Car Make 0 2017 Abarth 124 Spider ManualConvertible 1 2017 Abarth 124 Spider AutoConver
  • 已过时 - 关键帧之间的 FFMPEG 解码伪影

    将问题标记为过时 因为使用已弃用的 avcodec decode video2 I m currently experiencing artifacts when decoding video using ffmpegs api On wh