[FFmpeg] ffplay 播放灰度帧

ffplay 读取单通道的灰度图片时会将其扩充为 AV_PIX_FMT_RGB0,upload_texture() 函数中对应的 SDL 格式为 SDL_PIXELFORMAT_BGR888,因此可以正常播放。

经过神经网络算法处理后得到单通道灰度帧数据,ffplay 中的 upload_texture() 函数进行处理时,AV_PIX_FMT_GRAY8 对应的 SDL 格式为 SDL_PIXELFORMAT_UNKNOWN,视频播放会中断。因此需要把灰度帧使用 sws_scale() 函数进行转化。

/* frame -> frameRGB */

/* frameRGB -> torch::Tensor */

/* torch::Tensor -> frameGRAY */

/* frameGRAY -> frame */
torch::Tensor frameGRAY = out;
int frameGRAY_width = frameRGB->width;
int frameGRAY_height = frameRGB->height;
*img_convert_ctx = sws_getCachedContext(*img_convert_ctx,
    frameGRAY_width, frameGRAY_height, AV_PIX_FMT_GRAY8, 
    frame->width, frame->height, frame->format, 
    sws_flags, NULL, NULL, NULL);
if (*img_convert_ctx != NULL) {
    uint8_t *pixels[4], *frameGRAY_data[8];
    int pitch[4], frameGARY_linesize[8];
    frameGRAY_data[0] = out.data_ptr();
    frameGARY_linesize[0] = frameGRAY_width;
    if (!SDL_LockTexture(*tex, NULL, (void **)pixels, pitch)) {
        sws_scale(*img_convert_ctx, (const uint8_t * const *)frameGRAY_data, frameGARY_linesize,
            0, frameGRAY_height, frame->data, frame->linesize);
        SDL_UnlockTexture(*tex);
    }
} else {
    av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
    ret = -1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值