【C++】开源:多媒体SFML库使用入门

这篇具有很好参考价值的文章主要介绍了【C++】开源:多媒体SFML库使用入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍SFML库使用。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习知识,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

😏1. SFML库介绍

SFML (Simple and Fast Multimedia Library) 是一个开源的、跨平台的C++多媒体库,它提供了一系列简单易用的接口和工具,可以方便地创建各种图形、音频、视频等应用程序。SFML 支持 Windows, Linux, macOS 和 Android 四种操作系统。

SFML 提供了以下功能:

窗口管理:创建窗口,处理输入事件(键盘,鼠标),显示图像
图形绘制:支持 2D图形绘制,包括基本图形(点,线,矩形,圆等)、渲染纹理、精灵动画等
音频处理:支持 PCM 音频流播放、录制,以及音量控制、特效等
网络通信:支持 TCP 和 UDP 协议的网络通信
多线程处理:支持多线程并发处理,可以在主线程上更新窗口和处理输入事件

😊2. SFML库安装

SFML官网:https://www.sfml-dev.org/index.php

可通过apt或source code的方式安装,这里用的apt安装。

在Linux开发环境中,通过这条命令安装:sudo apt-get install libsfml-dev

😆3. SFML库使用

下面创建一个示例程序,来验证SFML安装成功:

一个窗口绘制示例:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

编译程序:

g++ -c main.cpp
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system
./sfml-app

运行如下:

sfml库,# c++开源项目学习,c++,开发语言,sfml

一个音频处理示例:

#include <SFML/Audio.hpp>
#include <iostream>

// 自定义音频处理函数
void processAudio(sf::Int16* samples, std::size_t sampleCount) {
    // 遍历每个样本并进行处理(示例:将音量降低一半)
    for (std::size_t i = 0; i < sampleCount; ++i) {
        samples[i] /= 2;
    }
}

int main() {
    // 加载音频文件
    sf::SoundBuffer buffer;
    if (!buffer.loadFromFile("audio.wav")) {
        std::cout << "无法加载音频文件" << std::endl;
        return EXIT_FAILURE;
    }

    // 获取音频数据
    const sf::Int16* samples = buffer.getSamples();
    std::size_t sampleCount = buffer.getSampleCount();

    // 处理音频数据
    processAudio(const_cast<sf::Int16*>(samples), sampleCount);

    // 播放处理后的音频
    sf::Sound sound;
    sound.setBuffer(buffer);
    sound.play();

    // 等待音频播放完成
    while (sound.getStatus() == sf::Sound::Playing) {}

    return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -o main -lsfml-audio -lsfml-system
# 运行如下,我现在没有音频文件
Failed to open sound file "audio.wav" (couldn't open stream)
无法加载音频文件

一个网络处理-tcpclient示例:

#include <SFML/Network.hpp>
#include <iostream>

int main() {
    // 创建TCP套接字
    sf::TcpSocket socket;

    // 连接到服务器
    sf::IpAddress serverIp = "127.0.0.1"; // 服务器IP地址
    unsigned short serverPort = 12345; // 服务器端口号
    sf::Socket::Status status = socket.connect(serverIp, serverPort);
    if (status != sf::Socket::Done) {
        std::cout << "无法连接到服务器" << std::endl;
        return EXIT_FAILURE;
    }

    // 发送数据到服务器
    std::string message = "Hello Server!";
    status = socket.send(message.c_str(), message.size() + 1); // 发送包括空字符在内的全部消息内容
    if (status != sf::Socket::Done) {
        std::cout << "发送消息失败" << std::endl;
        return EXIT_FAILURE;
    }

    // 接收服务器的响应
    char buffer[1024];
    std::size_t received;
    status = socket.receive(buffer, sizeof(buffer), received);
    if (status != sf::Socket::Done) {
        std::cout << "接收响应失败" << std::endl;
        return EXIT_FAILURE;
    }

    // 输出服务器的响应
    std::cout << "服务器的响应: " << buffer << std::endl;

    // 关闭套接字连接
    socket.disconnect();

    return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -lsfml-network -lsfml-system

一个多线程处理示例:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <thread>

// 线程函数
void threadFunction() {
    // 在后台线程中执行任务
    for (int i = 0; i < 5; ++i) {
        std::cout << "后台线程执行任务 " << i << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

int main() {
    // 创建窗口
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML 多线程示例");

    // 创建后台线程
    std::thread thread(&threadFunction);

    // 渲染循环
    while (window.isOpen()) {
        // 处理事件
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                // 关闭窗口时停止后台线程并退出程序
                thread.join();
                window.close();
            }
            else if (event.type == sf::Event::MouseButtonPressed) {
                // 单击窗口时输出消息
                std::cout << "前台线程接收到鼠标点击事件" << std::endl;
            }
        }

        // 清空窗口
        window.clear(sf::Color::White);

        // 刷新窗口
        window.display();
    }

    return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -lsfml-graphics -lsfml-window -lsfml-system -lpthread
运行如下:
后台线程执行任务 0
后台线程执行任务 1
后台线程执行任务 2
后台线程执行任务 3
后台线程执行任务 4
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件

sfml库,# c++开源项目学习,c++,开发语言,sfml

以上。文章来源地址https://www.toymoban.com/news/detail-593781.html

到了这里,关于【C++】开源:多媒体SFML库使用入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

    多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能,Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持,甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 Qt 多媒体模块提供了很多类,可以实现如下的

    2024年02月13日
    浏览(51)
  • Android多媒体功能开发(12)——使用Camera类拍照

    Android上用摄像头拍照、录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.camera2包。目前这两套API都可以使用,Camera类用起来比较简单易懂,但功能少灵活性差,所以现在降级使用;Camera2框架功能强大,对摄像头的控制灵活,但由于

    2023年04月13日
    浏览(43)
  • Android多媒体功能开发(11)——使用AudioRecord类录制音频

    AudioRecord类优点是能录制到缓冲区,能够实现边录边播(AudioRecord + AudioTrack)以及对音频的实时处理(如QQ电话)。缺点是输出是PCM格式的原始采集数据,如果直接保存成音频文件,不能够被播放器播放,所以必须用代码实现数据编码以及压缩。 使用AudioRecord录音的基本步骤是

    2023年04月09日
    浏览(45)
  • 软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

    提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 (1)自己的科研经历, 科研内容 ,学习的相关领域知识,要熟悉熟透了 (2)自己的实习经历,做了 什

    2024年02月09日
    浏览(57)
  • 参会记录|全国多媒体取证暨第二届多媒体智能安全学术研讨会(MAS‘2023)

    前言 :2023年4月8日上午,我与实验室的诸位伙伴们共聚浙江杭州西子湖畔的六通宾馆,参加了为期一天半的全国多媒体取证暨第二届多媒体智能安全学术研讨会(MAS’2023)。本届学术研讨会由浙江省自然科学基金委员会资助,杭州电子科技大学承办。来自国内多媒体取证与

    2024年02月08日
    浏览(58)
  • 多媒体音频焦点浅析

    多个音源可以同时向同一个输出流进行播放音频,如果没有音频焦点管控,就会出现多个音源同时播放的现象,给用户带来不便;而Android为了避免多个音源同时播放,就引入了音频焦点的概念,所有音频应用都统一按照音频焦点的规定执行,就可以避免该现象发生。 当应用

    2024年02月13日
    浏览(47)
  • 多媒体API

    许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 前端系列文章——传送门 后端系列文章——传送门 video 只接受几种视屏格式:ogg、mp4、avi 基本使用: controls属性,出现

    2024年02月02日
    浏览(58)
  • AIGC生成多媒体流程

    给定 生成多个故事标题 多个故事标题进行反向推导出 再生成标题 直到达到一个相似度 多个标题固定总结合并为一个标题 根据生成故事多个章节标题 多个章节标题反向生成一个标题 对比前后两个标题相似度 不断重复直到达到一定相似度 第一个章

    2024年02月12日
    浏览(52)
  • 多媒体开发之cgo

         go语言作为近十年来优秀的现代开发语言的代表,由于继承了c语言的简洁和很多现代语言的表达方式,在广泛的应用场景中得到众多爱好者的喜爱,如何将go和c、c++进行联合开发,拓展整个开发生态,不用重复造轮子,掌握cgo可以让你得心应手的在c和go之间传递信息,

    2024年02月16日
    浏览(49)
  • 计算机网络——多媒体网络

    通俗易懂,风趣幽默,忍不住分享一下给大家, 跳转到网站 我的计算机网络专栏,是自己在计算机网络学习过程中的学习笔记与心得,在参考相关教材,网络搜素的前提下,结合自己过去一段时间笔记整理,而推出的该专栏,整体架构是根据计算机网络 自顶向下 方法而整理

    2024年02月20日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包