FFmpeg和SDL的视频播放器
version: ffmpeg 6.x
FFmpeg API
打开一个视频文件,读取其流信息,找到视频编解码器,进行视频帧的解码和格式转换
123456789101112#pragma once#include <stdio.h>#define __STDC_CONSTANT_MACROS#define SDL_MAIN_HANDLEDextern "C" {#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>#include <libavutil/imgutils.h>}int ffmpeg_test();
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636 ...
RTSP前提知识
1. Epoll1.1 TCP通信大致流程
Sever端
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485// server.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <arpa/inet.h>int main(){ // 1. 创建监听的套接字 int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(0); } ...
ONVIF
1. ONVIF简介网络摄像头的标准协议中, 国际标准上有三大类 : ONVIF , PSIA , HDCCTV国内标准有 国标GB/T28181ONVIF, 与PSIA,HDCCTV相比,无论是厂商支持度, 厂商知名度, 还是市场占有率都领先
技术框架
ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供ONVIF规范涵盖了完全的XML及WSDL的定义每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service服务端与客户端的数据交互采用SOAP协议ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行传输比如 在IPC网络摄像头中 , IPC是Web Services服务端, 其提供的服务接口需符合ONVIF协议规范(这些接口定义在ONVIF规定的WSDL文档中)开发的客户端通过这些ONVIF规范接口跟IPC通讯 , 下面几条常见的功能:
获取IPC的基本信息(厂家信息、版本信息等)
修改IPC的系统日期、时间
修改IPC的网络配置(IP、子网掩码等)
获取/修改IPC摄像头的各种参数(视频分辨率、码率、帧 ...
Python
1. 基本语法
python为弱语言类型, 根据赋予的值决定具体数据类型
1234567891011121314151617# 标准输入输出name = input("inputyour name")# sep 为分割符(默认为空格), end 为结束符号(默认为换行符)print("hi", "im", sep = "-", end = "joke")# 格式化精度控制c = 11.5551print("%d" %c)print("%.2f" %c) #浮点型输出会自动四舍五入print("%5.1f" %c)# 11# 11.56# 11.6a = [1,2,3]print(type(a))# <class 'list'>
1.1 基本数据类型int 类型
无大小限制, 内存许可就无限大
1234567print(0b1101) #13 二进制print(0o734) #476 八进制p ...
GB28181
1. 国标GB28181摄像头模拟
实现了将h264封装ps流并打包rtp推流到服务器先抛开标题, 整体的GBServer需要交互Sip和流媒体(ZLMediaKit实现)两部分目前先了解Sip信令部分
ZLMediaKit获取实时流API127.0.0.1/index/api/getMediaList
1.1 Sip信令简介详细协议介绍见此
Sip(session initiation protocol) : 由互联网工程任务组制定的, 用于多方多媒体通信的框架协议是一个基于文本的应用层控制协议, 独立于底层传输协议, 用于建立、修改和终止IP网络上的双方或多方多媒体会话
信令 : 控制电路的信号,是终端和终端、终端和网络之间传递的一种消息,专门用来控制电路,建立、管理、删除连接, 以使用户能够正常通过这些连接进行通信
事务 : 客户和服务器之间的操作从第 1 个请求至最终响应为止的所有消息构成一个SIP事务一个正常的呼叫一般包含三个事务其中,呼叫启动包含两个操作请求:邀请(Invite)和证实(ACK),前者需要回送响应, 后者只是证实已收到最 ...
RTMP
1. 协议简介1.1 RTMPRTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议族,包括RTMP基本协议RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。支持该协议的软件包括Adobe Media Server/Ultrant Media Server/red5等。RTMP与HTTP一样,都属于TCP/IP四层模型的应用层。
应用层协议,依靠TCP保证可靠传输。
默认端口:1953,可能被防火墙屏蔽。
在流媒体/交互服务器之间进行音视频和数据通信。
1.2 HLSHLS(HTTP Live Streaming)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。所以在 Apple 的全系列产品包括 iPhone、 iPad、safari 都不需要安装任何插件就可以原生支持播放 ...
RTSP
1. RTSP协议简介
配置属性 -> 调试 -> 环境 :PATH=D:\ffmpeg\ffmpeg-master-latest-win64-gpl-shared\bin;D:\ffmpeg\SDL2-2.28.5\lib\x64用分号来写多个路径,可以指定dll文件,不必再必须配置环境变量.配置属性 -> VC++目录 -> 包含目录 :D:\ffmpeg\SDL2-2.28.5\includeD:\ffmpeg\ffmpeg-master-latest-win64-gpl-shared\includeD:\ffmpeg\vcpkg\include.配置属性 -> VC++目录 -> 库目录 :D:\ffmpeg\ffmpeg-master-latest-win64-gpl-shared\libD:\ffmpeg\SDL2-2.28.5\lib\x64D:\ffmpeg\vcpkg\lib.链接器 -> 输入 -> 附加依赖项 :avcodec.libavdevice.libavfilter.libavformat.liba ...
ffmpeg命令行简介
1. ffmpeg1.1 视频图片转换
视频生成图片
1ffmpeg -i input.mp4 -r 25 -f image2 data/image%3d.jpg
备注:
image%3d.jpg 表示生成的图片序号为3个数字image%d.jpg 表示生成的图片序号依次增加
-r 25 帧数
-f image2 格式化的格式
图片生成视频
1ffmpeg -r 1 -f image2 -i data/%d.jpg -vcodec libx264 -s 640*480 -g 1 -keyint_min 1 -sc_threshold 0 -pix_fmt yuv420p out.mp4
备注:
-vcodec libx264 指定合成视频的编码格式为h264
-r 1 fps等于1 (frame rate 帧率)这个参数需要写在 -f 之前,确保FFmpeg能够正确地解释输入文件的每秒图像数,并据此创建视频的时间轴。
-s 640*480 分辨率 (size)
-g 1 GOP长度(关键帧之间的间隔)
-keyint_min 1 keyint表示关键 ...
音视频入门
1. 音视频播放原理
2. 图像篇2.1 YUV和RGB音视频中编码前的图像格式,即YUV和RGB。
YUV,RGB,包括YcbCr是色彩空间的模型,而平常所说的BMP、PNG、JPEG是文件的存储形式。而YUV是音视频(编解码)最常用的格式。
YUV有两种分类方式,即空间-间和空间-内。空间-间的划分方式主要体现在Y、U、V的比例不同;空间-内的划分方式主要体现在Y、U、V的比例一定,存储格式不同。
1. YUV 空间-间 的数据划分
YUV按照空间-间的划分方式,分为YUV444、YUV422、YUV420,如下所示,假设图像为1920*1080:
2. YUV 空间-内 的数据划分
YUV按照空间-内的划分方式,主要分为packet、planar、semi-planar三种:
packet:打包格式,即先存储一个yuv,再存储下一个yuv;
planar:平面格式,即先存储y平面,再存储u平面,再存储v平面;
semi-planar:先存储y平面,再存储uv平面;
YUV422各种存储格式如下:
YUV420各种存储格式如下:
针对上图中的NV12、NV21 ...
代码随想录-补充篇
1. 单调栈# 1.1 739-每日温度739
1234567891011121314151617181920212223242526class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures) { int size = temperatures.size(); stack<int> st; st.push(0); vector<int> ans(size,0); //初始化为0,防止后续计算的递减导致无法找到而无法赋值 for(int i = 1; i < size; ++i) { if(temperatures[i] < temperatures[st.top()]) st.push(i); else if(temperat ...