FFmpeg教程:libswscale对图像进行简单处理

这篇具有很好参考价值的文章主要介绍了FFmpeg教程:libswscale对图像进行简单处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们在FFmpeg简单总结对FFmpeg 组成模块,编码进行了简单介绍。

FFmpeg组成部分:
libavcodec: 提供了音视频编解码器的库。
libavformat: 处理多媒体容器格式的库,包括封装和解封装。
libavutil: 包含一些公共的实用工具函数。
libswscale: 提供图像缩放和颜色转换功能的库。
libavfilter: 实现音视频过滤器的库,用于进行各种音视频处理操作。
ffmpeg: 命令行工具,用于进行音视频处理和转码。
ffprobe: 用于检测多媒体文件信息的命令行工具。
ffplay: 简单的播放器,支持音视频播放。

libswscale

libswscale(Software Scaling and Conversion Library)是FFmpeg中的一个库,用于执行图像缩放、颜色空间转换以及图像格式转换等操作。它主要提供了一些函数和工具,使得在视频处理过程中可以方便地进行图像大小和颜色空间的调整。

常用的API介绍

sws_getContext: 创建并返回一个SwsContext对象,用于设置缩放和颜色空间转换的参数。

struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
                                  int dstW, int dstH, enum AVPixelFormat dstFormat,
                                  int flags, SwsFilter *srcFilter,
                                  SwsFilter *dstFilter, const double *param);

sws_scale: 将输入图像进行缩放和颜色空间转换,并将结果输出到目标图像。

int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
              const int srcStride[], int srcSliceY, int srcSliceH,
              uint8_t *const dst[], const int dstStride[]);

sws_freeContext: 释放SwsContext对象占用的资源。

void sws_freeContext(struct SwsContext *swsContext);

灰度化

下面给出一个例子,使用FFmpeg对图像进行处理,该程序解码视频流,选取视频流中的输入图片,进行灰度化处理,然后保存为新的图片

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>

void process_image(const char *input_filename, const char *output_filename) {
    AVFormatContext *input_format_context = NULL;
    AVCodecContext *codec_context = NULL;
    AVCodec *codec = NULL;
    AVFrame *frame = NULL;
    AVFrame *gray_frame = NULL;
    AVPacket packet;
    struct SwsContext *sws_context = NULL;

    // Register FFmpeg components
    av_register_all();

    // Open input file
    if (avformat_open_input(&input_format_context, input_filename, NULL, NULL) != 0) {
        fprintf(stderr, "Error opening input file\n");
        exit(EXIT_FAILURE);
    }

    // Retrieve stream information
    if (avformat_find_stream_info(input_format_context, NULL) < 0) {
        fprintf(stderr, "Error finding stream information\n");
        exit(EXIT_FAILURE);
    }

    // Find the first video stream
    int video_stream_index = -1;
    for (int i = 0; i < input_format_context->nb_streams; i++) {
        if (input_format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            video_stream_index = i;
            break;
        }
    }

    if (video_stream_index == -1) {
        fprintf(stderr, "Error: No video stream found\n");
        exit(EXIT_FAILURE);
    }

    // Find the decoder for the video stream
    codec = avcodec_find_decoder(input_format_context->streams[video_stream_index]->codecpar->codec_id);
    if (!codec) {
        fprintf(stderr, "Error: No decoder found\n");
        exit(EXIT_FAILURE);
    }

    // Allocate a codec context for the decoder
    codec_context = avcodec_alloc_context3(codec);
    if (!codec_context) {
        fprintf(stderr, "Error allocating codec context\n");
        exit(EXIT_FAILURE);
    }

    // Copy codec parameters from input stream to codec context
    if (avcodec_parameters_to_context(codec_context, input_format_context->streams[video_stream_index]->codecpar) < 0) {
        fprintf(stderr, "Error setting codec parameters\n");
        exit(EXIT_FAILURE);
    }

    // Open codec
    if (avcodec_open2(codec_context, codec, NULL) < 0) {
        fprintf(stderr, "Error opening codec\n");
        exit(EXIT_FAILURE);
    }

    // Allocate video frames
    frame = av_frame_alloc();
    gray_frame = av_frame_alloc();
    if (!frame || !gray_frame) {
        fprintf(stderr, "Error allocating frames\n");
        exit(EXIT_FAILURE);
    }

    // Determine required buffer size and allocate buffer
    int num_bytes = av_image_get_buffer_size(AV_PIX_FMT_GRAY8, codec_context->width, codec_context->height, 1);
    uint8_t *buffer = (uint8_t *)av_malloc(num_bytes * sizeof(uint8_t));

    // Assign appropriate parts of buffer to image planes in gray_frame
    av_image_fill_arrays(gray_frame->data, gray_frame->linesize, buffer, AV_PIX_FMT_GRAY8, codec_context->width, codec_context->height, 1);

    // Initialize SwsContext for converting between color spaces
    sws_context = sws_getContext(
        codec_context->width, codec_context->height, codec_context->pix_fmt,
        codec_context->width, codec_context->height, AV_PIX_FMT_GRAY8,
        SWS_BILINEAR, NULL, NULL, NULL);

    // Open output file
    FILE *output_file = fopen(output_filename, "wb");
    if (!output_file) {
        fprintf(stderr, "Error opening output file\n");
        exit(EXIT_FAILURE);
    }

    // Read frames from the input file, convert to grayscale, and write to the output file
    while (av_read_frame(input_format_context, &packet) == 0) {
        if (packet.stream_index == video_stream_index) {
            // Decode video frame
            if (avcodec_receive_frame(codec_context, frame) == 0) {
                // Convert frame to grayscale
                sws_scale(sws_context, frame->data, frame->linesize, 0, frame->height, gray_frame->data, gray_frame->linesize);

                // Write grayscale frame to output file
                fwrite(gray_frame->data[0], 1, num_bytes, output_file);
            }
        }

        av_packet_unref(&packet);
    }

    // Cleanup
    fclose(output_file);
    av_frame_free(&frame);
    av_frame_free(&gray_frame);
    av_free(buffer);
    sws_freeContext(sws_context);
    avcodec_close(codec_context);
    avformat_close_input(&input_format_context);
}

int main() {
    const char *input_filename = "input.jpg";
    const char *output_filename = "output.gray";
    process_image(input_filename, output_filename);
    return 0;
}

放大缩小

也可以直接用接口函数,对image操作文章来源地址https://www.toymoban.com/news/detail-820309.html


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libswscale/swscale.h>

int main() {
    // Input image parameters
    int src_width = 1920;
    int src_height = 1080;
    enum AVPixelFormat src_format = AV_PIX_FMT_RGB24;

    // Output image parameters
    int dst_width = 640;
    int dst_height = 360;
    enum AVPixelFormat dst_format = AV_PIX_FMT_YUV420P;

    // Allocate source and destination buffers
    uint8_t *src_data[4];
    int src_linesize[4];
    uint8_t *dst_data[4];
    int dst_linesize[4];

    // Initialize SwsContext
    struct SwsContext *sws_context = sws_getContext(src_width, src_height, src_format,
                                                    dst_width, dst_height, dst_format,
                                                    SWS_BILINEAR, NULL, NULL, NULL);

    // Perform scaling and color space conversion
    sws_scale(sws_context, src_data, src_linesize, 0, src_height,
              dst_data, dst_linesize);

    // Free resources
    sws_freeContext(sws_context);

    return 0;
}

到了这里,关于FFmpeg教程:libswscale对图像进行简单处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFmpeg音视频处理工具介绍及应用

    FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合

    2024年02月08日
    浏览(73)
  • [音视频处理] FFmpeg使用指北1-视频解码

    本文将详细介绍如何使用ffmpeg 4.4在C++中解码多种格式的媒体文件,这些媒体文件可以是视频、视频流、图片,或是桌面截屏或USB摄像头的实时图片。解码文件后,还将每帧图片转换为OpenCV的Mat格式以供后续使用。 目录 1 基于ffmpeg的媒体文件解码 1.1 简介 1.2 详细代码 2 ffmpeg函

    2024年02月07日
    浏览(63)
  • JavaCV与FFmpeg:音视频流处理技巧

    1. JavaCV简介 JavaCV是一个开源的Java接口,为OpenCV、FFmpeg和其他类似工具提供了封装。它允许Java开发者直接在他们的应用程序中使用这些强大的本地库,而无需深入了解复杂的本地代码。JavaCV特别适用于处理图像和视频数据,提供了一系列的功能,如图像捕获、处理和视频编解

    2024年02月04日
    浏览(57)
  • 音视频处理 ffmpeg中级开发 H264编码

    libavcodec/avcodec.h 常用的数据结构 AVCodec 编码器结构体 AVCodecContext 编码器上下文 AVFrame 解码后的帧 结构体内存的分配和释放 av_frame_alloc 申请 av_frame_free() 释放 avcodec_alloc_context3() 创建编码器上下文 avcodec_free_context() 释放编码器上下文 解码步骤 avcodec_find_decoder 查找解码器 avcod

    2024年02月01日
    浏览(82)
  • Java工程使用ffmpeg进行音视频格式转换(ws.schild)

    JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。 这些库都是基于FFmpeg的,并允许在Java中处理音频和

    2024年02月14日
    浏览(87)
  • 强大开源的音视频处理工具ffmpeg安装与使用

    FFmpeg 是一个开源的跨平台音视频处理工具,提供了丰富的命令行模式下音视频处理功能,包括格式转换、编解码、过滤器应用等。 由于 FFmpeg 支持的格式广泛,且可用于多个平台和操作系统(如 Windows、Linux、MacOS 等),因此它已成为许多多媒体应用程序和服务的核心组件。

    2024年02月05日
    浏览(68)
  • 开源的跨平台的音视频处理工具FFmpeg

    FFmpeg是一个开源的跨平台的音视频处理工具,可以对音频、视频进行转码、裁剪、调节音量、添加水印等操作。 广泛的格式支持。 FFmpeg能够解码、编码、转码、复用、分离、流式传输、过滤和播放几乎人类和机器所创造的任何内容。它支持最古老且晦涩难懂的格式,也支持

    2024年02月15日
    浏览(63)
  • FFmpeg——开源的开源的跨平台音视频处理框架简介

    引言:         FFmpeg是一个开源的跨平台音视频处理框架,可以处理多种音视频格式。它由Fabrice Bellard于2000年创建,最初是一个只包括解码器的项目。后来,很多开发者参与其中,为FFmpeg增加了多种新的功能,例如编码器、过滤器、muxer、demuxer等等,使它成为了一个完整

    2024年03月23日
    浏览(65)
  • 【音视频处理】基础框架介绍,FFmpeg、GStreamer、OpenCV、OpenGL

    大家好,欢迎来到停止重构的频道。  本期我们介绍 音视频处理的基础框架 。 包括FFmpeg、GStreamer、OpenCV、OpenGL 。 我们按这样的分类介绍 : 1、编解码处理:FFmpeg、GStreamer 2、图像分析:OpenCV 3、复杂图像生成:OpenGL 首先是编解码处理的基础框架,这类基础框架的 应用场景

    2024年02月08日
    浏览(48)
  • 阿里云国际站代理商:FFmpeg 处理音视频文件的常用方法

    阿里云代理商( 聚搜云 )专业服务于阿里云ECS服务器采购、阿里云Ddos采购、阿里云waf采购、对象存储OSS、阿里云企业邮箱采购、阿里云国际站代理商、阿里云国际站充值、云安全中心(态势感知)、阿里云高可用云数据库RDS、web应用云waf防火墙、阿里云vpc企业网、阿里云

    2024年02月02日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包