C语言:创建简单的流媒体服务器来播放.flv文件

编写  httpFlv_server.cpp  如下

#include <iostream>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")char* get_filename(char* path) {char* last_slash = strrchr(path, '/');// 对于Windows系统,应该是 '\'if (last_slash == NULL) {last_slash = strrchr(path, '\\');}if (last_slash == NULL) {return path;} else {return last_slash + 1;}
}int main(int argc, char *argv[])
{int port = 8080;char* path;if (argc ==2){path = argv[1];} else if (argc ==3){port = atoi(argv[1]);path = argv[2];} else {printf(" usage: httpFlv_server port /your/video.flv ");return 1;}if (port <6000 || port >65500){printf(" 6000 <= port <= 65500 ");return 2;}printf("%s\n", path);int n = strlen(path);if (n >80){printf(" file path is too long.");return 3;}if (n < 8){printf(" file path is too short.");return 3;}char* ext = &path[n-4];if (strcmp(ext, ".flv") !=0){printf(" file ext is not .flv ");return 3;}printf("httpFlv_server http://127.0.0.1:%d/%s\n", port, get_filename(path));WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){perror("WSAStartup error");return -1;}SOCKET serverFd;SOCKADDR_IN server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//server_addr.sin_addr.s_addr = inet_addr("192.168.2.61");server_addr.sin_port = htons(port);serverFd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (bind(serverFd, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR) {perror("socket bind error");return -1;}if (listen(serverFd, SOMAXCONN) < 0) {perror("socket listen error");return -1;}constexpr char http_headers[] = \"HTTP/1.1 200 OK\r\n" \"Access-Control-Allow-Origin: * \r\n" \"Content-Type: video/x-flv\r\n" \"Content-Length: -1\r\n" \"Connection: Keep-Alive\r\n" \"Expires: -1\r\n" \"Pragma: no-cache\r\n" \"\r\n";int http_headers_len = strlen(http_headers);/*constexpr char http_headers[] = \
"HTTP/1.1 200 OK\r\n" \
"Access-Control-Allow-Origin: * \r\n" \
"Cache-Control: no-cache\r\n" \
"Content-Type: video/x-flv\r\n" \
"Connection: close\r\n" \
"Expires: -1\r\n" \       //设置资源的有效期来控制http的缓存
"Pragma: no-cache\r\n" \  //用于客户端发送的请求中。客户端会要求所有的中间服务器不返回缓存的资源
"\r\n"
;*/while (true){printf(" waiting ...");int len = sizeof(SOCKADDR);SOCKADDR_IN accept_addr;int clientFd = accept(serverFd, (SOCKADDR*)&accept_addr, &len);//const char* clientIp = inet_ntoa(accept_addr.sin_addr);if (clientFd == SOCKET_ERROR) {perror("accept connection error");break;}printf(" connect ... clientFd=%d\n", clientFd);unsigned char buf[4096];char bufRecv[2001] = { 0 };FILE* fp;fp = fopen(path, "rb");if (!fp) {printf("Error: fopen %s failed!", path);break;}else {int times = 0;while (true) {times++;if (times == 1) {int bufRecvSize = recv(clientFd, bufRecv, 2000, 0);printf("bufRecvSize=%d, bufRecv=%s\n", bufRecvSize, bufRecv);send(clientFd, http_headers, http_headers_len, 0);}else {//usleep(1000 * 100);Sleep(10);int bufLen = fread(buf, 1, sizeof(buf), fp);//  fseek(srcFile, 0, SEEK_CUR);int ret = send(clientFd, (char*)buf, bufLen, 0);if (ret <= 0) {break;}else {//printf("send bufLen=%d,ret=%d \n", bufLen, ret);}}}}if (fp) {fclose(fp);}closesocket(clientFd);printf("close clientFd=%d\n", clientFd);}closesocket(serverFd);return 0;
}

编译 cl httpFlv_server.cpp  /EHsc /utf-8 

运行 httpFlv_server  /flask/videos/test.flv 

或者 编写 win_gcc.bat  如下

SET INCLUDE=D:\Strawberry\c\include
SET LIB=D:\Strawberry\c\x86_64-w64-mingw32\lib
g++  %1.cpp -o %1.exe  -lws2_32

编译执行  win_gcc.bat httpFlv_server


npm i flv.js -save ;
cd D:\nodejs\node_modules\flv.js\dist ;
copy flv.min.js flv.min.js.map to /flask/static/
编写 flvPlayer.html  如下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><title> flv.js 播放器</title><script src="/static/flv.min.js"></script>
</head>
<body><video id="video1" width="1000" height="576" controls ></video><script>if (flvjs.isSupported()) {var video1 = document.getElementById('video1');var flvplayer = flvjs.createPlayer({type: 'flv', // 媒体类型: auto, flv, mp4isLive: false, // 是否是直播流,默认 trueurl: 'http://127.0.0.1:8080/test.flv'});flvplayer.attachMediaElement(video1);flvplayer.load(); // 加载流flvplayer.play(); // 播放流}</script>
</body>
</html>
  1. 用 Chrome 浏览器访问 http://localhost:5555/flv/  可以播放,测试 Edge 不支持。

  2. 也可以用 ffplay 测试是否能播放
    ffplay -i http://127.0.0.1:8080/test.flv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】 如何将列表转换为字符串

基本原理 在Python中&#xff0c;列表&#xff08;list&#xff09;和字符串&#xff08;string&#xff09;是两种不同的数据类型。列表是一个有序的元素集合&#xff0c;可以包含不同类型的元素&#xff0c;而字符串则是一个字符序列。有时&#xff0c;我们可能需要将列表中…

【chagpt】广泛使用API之前:考虑成本和数据隐私

文章目录 一. 定价和标记限制二. 安全和隐私 在广泛使用API之前&#xff0c;应该考虑两个重要因素&#xff1a;成本和数据隐私。 一. 定价和标记限制 OpenAI在Pricing页面上列出了模型的定价。请注意&#xff0c;OpenAI不一定及时更新该页面上的定价信息&#xff0c;因此实际…

【AI学习】什么是token?

在近期举办的Stripe Sessions用户大会上&#xff0c;移动支付巨头Stripe的联合创始人兼CEO帕特里克克里森&#xff08;Patrick Collison&#xff09;&#xff0c;与英伟达CEO黄仁勋进行了一场炉边对话。 黄仁勋提到&#xff1a;“我们正在经历一场前所未有的工业革命。这次工业…

预训练模型语义相似性计算(十一) - M3E和BGE

M3E m3e由MokaAI 训练&#xff0c;开源和评测。 m3e的详细介绍可以看官方的github介绍。本文简要摘录其中一些点&#xff0c;以便后续的应用。 1.千万级 (2200w) 的中文句对数据(开源)。 2.支持同质相似句计算(s2s)和异质检索(s2p)&#xff0c;后续支持代码检索。 3.m3e基座模…

MySQL 满足条件函数中使用查询最大值函数

在实际的数据库操作中&#xff0c;我们常常需要根据某些条件找到最大值并据此进行下一步的操作。例如&#xff0c;在一个包含订单信息的表中&#xff0c;可能需要找到特定客户的最大订单金额&#xff0c;并据此进行某些统计或决策。MySQL 提供了多种函数和查询方法&#xff0c;…

C# 泛型函数

1.非约束 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace MyGeneirc {public class GeneircMethod{/// <summary>/// 泛型方法解决&#xff0c;一个方法&#xff0c;满足不同参数类型…

JVM学习-彻底搞懂Java自增++

从字节码角度分析i和i的区别 public void method6() {int i 10;i; //在局部变量表上直接加1}public void method7() {int i 10;i; //字节码同i}public void method8() {int i 10;int a i; //通过下图可以看出先将局部变量表中的值push到操作数栈&#xff0c;然…

springboot项目部署到linux服务器

springboot后端 修改前 修改后 vue前端 修改前 将地址中的 localhost改为 ip 重新生成war包 war上传到linux的tomcat的webapps下 其他环境配置和macOS大差不差 Tomcat安装使用与部署Web项目的三种方法_tomcat部署web项目-CSDN博客

rk3568_mutex

文章目录 前言1、什么是mutex?1.1mutex互斥体API函数二、实验2.1实验目的2.2源码2.3结果图前言 本文记录的是rk3568开发板基础上做的mutex实验 1、什么是mutex? mutex是互斥体,它是比信号量semaphore更加专业的机制。 在我们编写Linux驱动的时候遇到需要互斥的地方建议使用…

css3 笔记01

目录 01 css3选择器 02 伪类选择器 03 伪元素选择器 04 文章分割列 05 浏览器hack写法 06 css3中的2D转换 01 css3选择器 选择器选择器{} 表示选择下一个兄弟 选择器1~选择器2{} 表示选中选择1后面所有包含选择器2的元素. [属性名]{} 包含属性名的选择器 选择器[属性名]…

Linux用户管理指令004

1、useradd 是用于创建新用户的命令。以下是 useradd 命令的一些常用选项及其简要说明&#xff0c;以清晰的分点方式表示&#xff1a; -u, --uid UID指定用户的用户ID&#xff08;UID&#xff09;。如果不指定&#xff0c;系统通常会分配一个未使用的最小UID。 -g, --gid GROUP…

Matlab读取Swarm球谐系数,并绘制EWH全球格网图(存在疑问)

ICGEM官网下载 COST-G发布的4040的球谐系数 close all; clearvars -except; % addpath(E:\Code\Tool\Function\GRACE_functions); dir_degree_1 E:\Code\GRACE_data\Degree_1\deg1_coef.txt; dir_c20 E:\Code\GRACE_data\Degree_2\C20_RL06.txt; myDir_Swarm E:…

深入理解栏目函数:从基础结构到实际应用

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、栏目函数的基本结构解析 代码案例 二、栏目函数的参数理解与返回值探究 参数取值与返…

2024年上半年软件设计师试题及答案(回忆版)

目录 基础知识选择题案例题1.缺陷识别的数据流图2.球队、球员、比赛记录的数据库题3.用户、老师、学生、课程用例图4.算法题5.程序设计题基础知识选择题 树的节点,度为4的有4个,度为3的有8个,度为2个有6个,度为1的有10个,问有几个叶子结点 二位数组,一个元素2个字节,A0…

pgsql 多个模式相同的表获取主键

pgsql 有一个库, 里面有多个模式, 每个模式下可能有相同的表, 如何获取表的主键 SELECT tc.table_schema AS 模式, tc.table_name AS 表名, kcu.column_name AS 列名 FROM information_schema.table_constraints AS tc JOIN information_schema.key_colum…

php TP8 阿里云短信服务SDKV 2.0(跳大坑)

安装&#xff1a;composer require alibabacloud/dysmsapi-20170525 2.0.24 官方文档&#xff1a;短信服务_SDK中心-阿里云OpenAPI开发者门户 (aliyun.com) 特别注意&#xff1a;传入参数获得值形式 这样也不行 $sendSmsRequest new SendSmsRequest($addData); 还有一个大坑…

大模型日报2024-05-28

大模型日报 2024-05-28 大模型资讯 SDAIA的阿拉伯语大模型ALLaM在IBM watsonx上全面运行 摘要: 由沙特数据和人工智能局&#xff08;SDAIA&#xff09;开发的开源阿拉伯语大语言模型ALLaM现已在IBM的watsonx平台上全面运行。 AI公司Anthropic揭示大语言模型内在工作机制 摘要: …

【CSharp】无符号短整型数组ushort[]转化为IntPtr

【CSharp】无符号短整型数组ushort[]转化为IntPtr 1.背景2. 代码1.背景 我们的相机或者探测器是一个感光的传感器,一般将光波打到闪烁体上,闪烁体发光后进行光电转换得到电信号,您可以这么简单的去理解。 这里就设计相机传感器上的AD转换器(模拟信号->数字信号)的bit数…

Nginx实战:https 配置SSL证书

目录 一、上传证书 二、nginx配置 三、生效配置 一、上传证书 将SSL证书文件&#xff08;如.crt或.pem文件&#xff09;和私钥文件&#xff08;如.key文件&#xff09;上传到服务器的某个目录&#xff0c;如/etc/nginx/ssl/ 二、nginx配置 server { listen 443 ssl; se…

输入字符串fgets

输入字符串fgets fgets 是C语言中的一个函数&#xff0c;用于从指定的文件流&#xff08;如标准输入、文件等&#xff09;读取一行字符串。它通常用于读取用户输入或从文件中读取文本行。fgets 函数的原型如下&#xff1a; char *fgets(char *str, int n, FILE *stream);参数说…