b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

如何用FFMPEGAPI做一般的硬解码和软解码?(2)

电脑杂谈  发布时间:2021-05-04 07:01:31  来源:网络整理

enum AVPixelFormat get_hw_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt) {
 for (const enum AVPixelFormat *p = fmt; *p != -1; p++) {
 if (*p == hw_pix_fmt) return *p;
    }
 return AV_PIX_FMT_NONE;
}

我们还可以在AVCodec结构中读取此回调函数的定义,我们知道:

fmt是此编支持的像素格式,并根据质量进行排序;如果没有特殊需要,可以省略此步骤。默认情况下,内部使用“本机”格式。

* callback to negotiate the pixelFormat
 * @param fmt is the list of formats which are supported by the codec, it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. The first is always the native one.
 * @note The callback may be called again immediately if initialization for the selected (hardware-accelerated) pixel format failed.
 * @warning Behavior is undefined if the callback returns a value not in the fmt list of formats.
 * @return the chosen format
 * - encoding: unused
 * - decoding: Set by user, if not set the native format will be chosen.

硬解码步骤3.准备并打开硬解码

硬解码步骤4.以检索数据

根据一般的软件解决方案过程,在调用avcodec_receive_frame()之后,获得的数据实际上仍在硬件模块/芯片上,也就是说,如果由CUDA解码,则该数据在视频内存上(或在视频卡编码器/缓冲区)。对于许多应用程序,解码后通常需要进行后续操作,例如另存为图片,然后需要检索数据。

III。 FFMPEG硬解码存在问题问题1:如果要转换为硬解码不直接支持的像素格式,该怎么办?

答案:不直接支持硬解码,因此不可能在解码后直接获得它。实际做法主要提供两种最常见的做法:

目标格式经过硬解码,然后通过av_hwframe_transfer_data()传输到内存,最后由sws_scale()完成。使用NV12作为目标格式(大多数硬件解码支持),然后通过av_image_copy_to_buffer()复制AVFrame数据,最后使用opencv工具进行转换。

以上提供的两种方法都在最后一步中由CPU完成。如果有更好的方法,请留言或交换私人消息。

作者在这里踩了一些坑:

坑1:直接通过回调函数将编的目标像素格式设置为所需的格式,例如BGR24。结果,立即报告了一个错误,并且根本无法执行解码。

坑2:请勿直接执行av_hwframe_transfer_data()sws_scale(),然后执行coredump。

问题2:是否有更好的方法在硬件设备和系统内存之间直接传输数据?

答案:这取决于情况。一般来说,通常建议使用av_hwframe_transfer_data()。此函数将调用硬解码的内部数据副本进行传输,但是实际效果通常会因具体实现而有所不同。例如,当我研究qsv时,作者发现此功能占用大量CPU(后来,Intel共同解决了此问题)。使用CUDA时,性能可以接受。

在上一个问题的第二个解决方案中,如果硬解码编支持您需要的格式,然后直接将其设置为目标格式,最后使用av_image_copy_to_buffer()复制,则可以省略av_hwframe_transfer_data ()。

问题3:如何知道硬件设备支持的目标像素格式?

答案:av_hwdevice_get_hwframe_constraints()!

此功能可以获取此硬件设备的限制,例如最大和最小长度和宽度以及目标像素格式。

写在后面

在联系了两个平台的硬解码之后,作者发现它们各自的特性是不同的。此外,除了在更多平台上进行扩展,探索和实践之外,硬解码工作实际上还具有许多可以探讨的深入主题:

除了使用FFMPEG的本机硬编之外,用户还可以使用FFMPEG +制造商提供的编API来完成它;如果是FFMPEG不支持的硬解码方案,则还可以添加与FFMPEG源代码相关的硬件。文件已集成。 ... ...

如果本文有任何遗漏或不正确之处,请添加并更正它们。也欢迎一起分享技术问题。 :)


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-372911-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 胡远航
      胡远航

      领海的概念就还没有法律意义

    热点图片
    拼命载入中...