FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
FFMPEG: sws_scale returns error: Slice parameters 0, 2160 are invalid
我正在尝试按照教程在 SDL 中显示 ffmpeg AVFrame 输出。教程(以及我在网上看到的所有示例(仍在使用"sws_getContext",该"已被弃用并从最新版本的 ffmpeg 中删除。尝试将当前像素格式从当前更改为PIX_FMT_YUV420P,以便我可以显示它。我相信我需要sws_scale函数来完成此操作。
但是,sws_scale是导致命令行错误的函数:切片参数 0, 2160 无效
这是我与swsContext相关的所有代码:
struct SwsContext* av_sws_ctx = NULL;
av_sws_ctx = sws_alloc_context();
sws_init_context(av_sws_ctx, NULL, NULL);
sws_scale(av_sws_ctx, (uint8_t const* const*)av_frame->data,
av_frame->linesize, 0, av_codec_context->height,
av_frame->data, av_frame->linesize);
更复杂的是,SwsContext 仅在 ffmpeg 内部定义,在外部我无法设置/获取任何变量,甚至无法在调试器中查看它们。
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, intsrcSliceH, uint8_t *const dst[], const int dstStride[] (
除av_sws_ctx外的其他参数的值:
srcSlice: av_frame->data =
8 arrays, first is filled with "x10x10x10x10x10..."
second and third are "€€€€€€€€€€€€€€€€€..."
rest are NULL
linesize(av_frame->linesize) is an array:
3840,1920,1920,0,0,0,0,0
srcSliceY:0
srcSliceH:2160
dest: same as second parameter (av_frame->data)
dstStride: av_frame->linesize again
如果我深入研究sws_scale源代码,我发现此错误是由以下代码块引发的:
if ((srcSliceY & (macro_height-1)) ||
((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->srcH) ||
srcSliceY + srcSliceH > c->srcH) {
av_log(c, AV_LOG_ERROR, "Slice parameters %d, %d are invalidn", srcSliceY, srcSliceH);
return AVERROR(EINVAL);
}
因此,我认为问题是我的视频高度大于sws_context(4k视频(。但是不知道如何使用sws_alloc_context或sws_init_context或任何其他功能来判断sws_context的高度。
看到我缺少什么了吗?谢谢。
是的,缺少一些东西。
忘记sws_init_context(av_sws_ctx, NULL, NULL);
1( 使用以下之一初始化sws_context(一次(:
// for UPSCALE
av_sws_ctx = sws_getContext(src_width, src_height, src_pixfmt,
dst_width, dst_height, dst_pixfmt,
SWS_BILINEAR, NULL, NULL, NULL);
// for DOWNSCALE
av_sws_ctx = sws_getContext(src_width, src_height, src_pixfmt,
dst_width, dst_height, dst_pixfmt,
SWS_BICUBIC, NULL, NULL, NULL);
2(然后要求转换:
int ret = sws_scale(swsContext,
srcframe->data, /* srcSlice[] */
srcframe->linesize, /* srcStride[] */
0, /* srcSliceY */
src_height, /* srcSliceH */
dstframe->data, /* dst[] */
dstframe->linesize); /* dstStride[] */
请注意,src 和 dst 帧是不同的 AVFrame 实例。
上面的高档和下尺度线是建议,因为我更喜欢不同的算法(双线性与双立方(。
希望有帮助。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效