FFMPEG中的swscale提供了视频原始数据(YUV420,YUV422,YUV444,RGB24…)之间的转换,分辨率变换等操作,使用起来十分方便,在这里记录一下它的用法。 swscale主要用于在2个AVFrame之间进行转换。 return 0; } 从代码中可以看出,解码后的视频帧数据保存在pFrame变量中,然后经过swscale函数转换后,将视频帧数据保存在pFrameYUV变量中。
一方面在送入 swscale 处理前,会强行指定 swscale 的输出 AVPixelFormat 为 AV_PIX_FMT_BGR8。 通过对 scale 滤镜分析,发现虽然其底层调用的是 swscale,为什么又要对 AV_PIX_FMT_PAL8 做这么多特殊逻辑呢?是不是 swscale 对 PAL8 有什么特殊限制呢? 我们继续深入到 swscale 内部进行分析。我们先看下 sws_isSupportedInput、sws_isSupportedOutput 的实现。 因为 scale 滤镜到 swscale 滤镜中间做了一次 AV_PIX_FMT_BGR8 转换,所以透明通道丢失了。 没有数据在 AVFrame.data[1],所以 swscale 并没有处理AVFrame.data[1],最终输出的帧里面也不会有透明通道。
desc failed at src/libswscale/swscale_internal.h:668 这个错误通常发生在使用FFmpeg中的swscale库进行视频帧格式转换的过程中。 我们可以以视频转码为例来展示如何使用FFmpeg解决在swscale库中遇到的Assertion desc failed错误。 SWScale是FFmpeg项目中的一个库,用于图像尺寸的转换和调整,以及颜色空间的转换等操作。" swscale_internal.h"是SWScale的内部头文件,用于定义内部的结构体、函数和常量等。 结论在使用FFmpeg的swscale库时,遇到Assertion desc failed at src/libswscale/swscale_internal.h:668错误通常表示一个内部断言失败。
avutil \ -l$$PWD/FFMPEG_WIN32_LIB_4.2.2/lib/swresample \ -l$$PWD/FFMPEG_WIN32_LIB_4.2.2/lib/swscale libavutil/opt.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h > } #pragma comment(lib, "avcodec.lib") #pragma comment(lib, "avformat.lib") #pragma comment(lib, "swscale.lib
下面给出初始化的代码: //video_swscale_core.cpp static AVFrame *input_frame= nullptr; static struct SwsContext * static enum AVPixelFormat src_pix_fmt=AV_PIX_FMT_NONE,dst_pix_fmt=AV_PIX_FMT_NONE; int32_t init_video_swscale <<endl; return -1; } return 0; } 初始化保存输入视频的AVFrame结构,并分配内存空间: //video_swscale_core.cpp 下面给出代码: //video_swscale_core.cpp int32_t transforming(int32_t frame_cnt){ int32_t result=0; uint8 input_file_name,output_file_name); if(result<0){ return -1; } result=init_video_swscale
而代码中我们正好用了ffmpeg实现的swscale()方法。在正式编码之前,我们需要用该方法将YUV数据转换为RGB数据来处理。因此,此处调用正是症结所在。 既然是swscale()方法的原因,那么是否可以在渲染的时候通过多重采样来降低图形噪声呢?事实上还是too young too simple。开启多重采样还是没有卵用。 我们的渲染库又必须采用RGB格式的数据,难道不用swscale()方法么?是否有替代品呢? 这么一搜索还真有! 编码的视频效果对比如下(上图是libyuv实现,下图是ffmpeg的swscale实现): ? ? 可以看出来,下图有类似于水面波纹一样的噪声,而上图则几乎不可见。
PROPERTIES IMPORTED_LOCATION ${lib_src_DIR}/libswresample-2.so) add_library(swscale -4_lib SHARED IMPORTED) set_target_properties(swscale-4_lib PROPERTIES IMPORTED_LOCATION add_library(swscale-4_lib SHARED IMPORTED) set_target_properties(swscale-4_lib PROPERTIES IMPORTED_LOCATION extern "C"{ #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h 故需添加 extern "C"{ include "libavcodec/avcodec.h" include "libavformat/avformat.h" include "libswscale/swscale.h
IMPORTED_LOCATION ${my_lib_path}/${ANDROID_ABI}/libswresample-1.so) #将第三方库作为动态库引用 add_library(swscale -3 SHARED IMPORTED) #指定第三方库的绝对路径 set_target_properties(swscale-3 PROPERTIES avfilter-5 avformat-56 avutil-54 postproc-53 swresample-1 swscale include "libavcodec/avcodec.h" //封装格式处理 #include "libavformat/avformat.h" //像素处理 #include "libswscale/swscale.h
disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-avdevice --disable-swresample --disable-swscale disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-avdevice --disable-swresample --disable-swscale
extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h ) #pragma comment(lib, "postproc.lib") #pragma comment(lib, "swresample.lib") #pragma comment(lib, "swscale.lib ▫ swscale:视频像素数据格式转换 #define __STDC_CONSTANT_MACROS #ifndef INT64_C #define INT64_C(c) (c ## LL) #define
/ThirdLibs/${ANDROID_ABI}/libswresample.so) add_library(swscale SHARED IMPORTED) set_target_properties (swscale PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/.. avutil postproc swresample swscale
: 主要API更改和弃用包括: avcodec编解码操作方面的大量更改 用于音频和视频编解码处理的API 解耦了编解码器的输入和输出操作 新的回调方式:允许编码器输出的数据存储到用户可管理的缓冲区域 swscale )的解码器 在VideoToolbox的支持能力中增加了VP9和Prores的编解码能力 对Vulkan支持(尤其是Vulkan filter)的改进 龙芯的新架构loongarch平台的支持与优化 swscale
extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h avutil.lib") #pragma comment(lib,"postproc.lib") #pragma comment(lib,"swresample.lib") #pragma comment(lib,"swscale.lib
/jniLibs/armeabi-v7a/libswresample.a) add_library(swscale STATIC IMPORTED) set_target_properties(swscale avformat avdevice avfilter avutil postproc swresample swscale
这八个库的名字是avcodec、avdevice、avfilter、avformat、avutil、postproc、swresample、swscale,下面分别对这些库展开介绍。 8、swscale swscale是FFmpeg的视频图像转换库,它主要用于图像缩放、色彩空间转换等功能,其中色彩空间转换有时也被称作像素格式转换,比如把视频帧从YUV格式转换为RGB格式。
推荐顺序 : ① avfilter , ② avformat , ③ avcodec , ④ avutil , ⑤ swresample , ⑥ swscale ; # FFMPEG 静态库 avformat 库 avfilter avformat avcodec avutil swresample swscale avformat 库 avfilter avformat avcodec avutil swresample swscale
YUV 分量取值范围 : 0 ~ 255 ; 这类 标准 是在 计算机 中使用的 ; 4、转换函数库 实际使用时 , RGB 与 YUV 编码格式转换 , 都是调用接口实现 , 如 FFmpeg 的 swscale 库 , 或者 libyuv 库 ; FFmpeg 的 swscale 库 是用于图像缩放和像素格式转换的库 , 该函数库 提供了 高度优化的函数 , 用于在不同的像素格式之间进行转换 , 以及进行图像的大小调整
PROPERTIES IMPORTED_LOCATION ${DIR}/libswresample-3.so ) # 添加音频采样数据格式转换库 add_library(swscale -5 SHARED IMPORTED) set_target_properties( swscale-5 PROPERTIES IMPORTED_LOCATION avutil-56 avresample-4 swresample-3 swscale System.loadLibrary("avresample-4"); System.loadLibrary("swresample-3"); System.loadLibrary("swscale
1 FFMPEG 库介绍 1.1 ffmpeg的7个库 ffmpeg有7个library,分别是: avutil swscale swresample avcodec avformat avdevice swscale 视频像素数据格式转换 swscale库执行高度优化的图像缩放以及色彩空间和像素格式转换操作,这个库执行以下转换: Recailing:是改变视频大小的过程。 ffmpeg/lib/x64/postproc.lib \ $$PWD/ffmpeg/lib/x64/swresample.lib \ $$PWD/ffmpeg/lib/x64/swscale.lib
视频渲染优化 前文中,我们都是将解码的视频帧通过 swscale 库转换为 RGBA 格式,然后在送给 OpenGL 渲染,而视频帧通常的格式是 YUV420P/YUV420SP ,所以大部分情况下都需要 swscale 进行格式转换。 当视频尺寸比较大时,再用 swscale 进行格式转化的话,就会存在性能瓶颈,所以本文将 YUV 到 RGBA 的格式转换放到 shader 里,用 GPU 来实现格式转换,提升渲染效率。 ? image.pLineSize[0] = frame->linesize[0]; image.ppPlane[0] = frame->data[0]; } else { //其他格式由 swscale