自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 视频编码原理补(H264)

补充前面说了各种 为啥编码 编码步骤 尝试按照一个逻辑串一下首先 人眼对于亮度信息更加敏感,而对于色度信息稍弱,所以视频编码是将 Y 分量和 UV 分量分开来编码的。 这是用YUV 的原因 但是为啥不用RGB呢? 因为RGB的三个颜色之间具有相关性其次 在知道 4种冗余空间冗余: 相邻的比较相似时间冗余 :相邻帧之间比较相似视觉冗余: 人的眼睛对于图像中高频信息的敏感度是小于低频信息的。有的时候去除图像中的一些高频信息,人眼看起来跟不去除高频信息差别不大,这种叫做视觉冗余。信息熵冗余:

2022-08-11 13:51:32 347 1

原创 WebRTC-1V1音视频通话websocket 业务代码2(业务复现)

主要架构1 peerA 向着 服务端发送join信令// 获取本地流 promise 的thenfunction openLocalStream(stream) { console.log('Open local stream'); doJoin(roomId); localVideo.srcObject = stream; localStream = stream;}function doJoin(roomId) { var jsonMsg = {

2022-05-25 16:10:45 521

原创 WebRTC-1V1音视频通话websocket 业务代码1(主要框架)

逻辑图服务端代码var ws = require("nodejs-websocket")var prort = xxxx;// join 主动加入房间// leave 主动离开房间// new-peer 有人加入房间,通知已经在房间的人// peer-leave 有人离开房间,通知已经在房间的人// offer 发送offer给对端peer// answer发送offer给对端peer// candidate 发送candidate给对端peerconst SIGNAL_TYPE_

2022-05-12 22:22:50 1076

原创 WebRTC 1对1音视频通话 信令协议设计

主要逻辑图蓝色部分为主要 信令逻辑 (注意箭头)信令逻辑采用json封装格式1. join 加入房间 2. resp­_join 当join房间后发现房间已经存在另一个人时则返回另一个人的uid;如果只有自己则不返回 3. leave 离开房间,服务器收到leave信令则检查同一房间是否有其他人,如果有其他人则通知他有人离开 4. new­peer 服务器通知客户端有新人加入,收到new­peer则发起连接请求 5. peer­leave 服务器通知客户端有人离开 6. offer 转发

2022-05-12 22:09:54 551

原创 RTCPeerConnection基本概念 -- 以及创建和绑定音视频以及渲染远端视频时候的作用

RTCPeerConnection 是WebRTC的核心的 是其暴露个用户的统一接口 其由多个模块组成· 网络处理模块· 服务质量模块· 音视频引擎模块 等等最最厉害的就是根据网络情况动态调整出音视频的最佳服务质量创建RTCPeerConnection配置ICE 也就是建立网络协商方式var pcConfig = { 'iceServers': [{ 'urls': 'turn:xxx.fun:3478', 'credential': "root", 'use

2022-05-09 22:43:46 2371

原创 网络编程-Socket_UDP_demo

网络示意图不同于前面的TCP UDP 没有连接的概念 所以绑定以后不用侦听 直接收发就行所以只需要开启一个服务器socket 就是 不需要对应的每个数据传输的socketSocket_UDP 服务端逻辑1 设置地址和选择协议IPV4/IPV6 struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(9876); addr.sin_addr.s_addr = hton

2022-05-05 17:39:52 1634

原创 网络通讯-Socket-TCP-demo(C语言版)

流程图TCP server 服务端步骤如图所示1 创建Socket 指定使用什么协议 socket_fd = socket(AF_INET,SOCK_STREAM,0);2 将Socket与地址和端口绑定//set socket addresslocal_addr.sin_family = AF_INET;local_addr.sin_port = htons(PORT);local_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(lo

2022-05-05 17:17:48 1534

原创 WebRTC 一对一通讯过程 常规架构

WebRTC 一对一通讯过程通讯中的双方成为 Call 和 Called 但是实际上两个终端的内部逻辑是一样的步骤解释用call 对象解释1 首先调用音视频设备检测模块 检测终端中是否有可用的音视频设备2 调用音视频采集模块冲设备中采集音视频数据3 开启客户端录制4 听过信令模块和信令服务器建立连接5 创建RTCPeerConnection(WebRTC最核心的对象 后面是音视频数据传输靠他完成) RTCPeerConnection创建好以后 将其和之前采集的音视频数据绑定在

2022-04-29 23:47:50 203

原创 ffplay-主要数据结构分析

数据结构分析VideoState其实主要作用和800行代码写一个播放器作用中一样 就是一个主要封装类保存 其中各项的主要内容个人觉得比较需要注意到的 几个非重点常用对象1 abort_request 就是判断这个时候有没有 退出播放 如果退出了 那就一系列退出操作2 force_refresh 视频播放时候用的3 av_sync_type ffplay 支持3种同步方式typedef struct VideoState { SDL_Thread *read_tid;

2022-04-25 17:23:15 811

原创 ffplay-PacketQueue 剖析

PacketQueue 总结PacketQueue设计思路:1 设计⼀个多线程安全的队列,保存AVPacket,同时统计队列内已缓存的数据⼤⼩。(这个统计数据会 ⽤来后续设置要缓存的数据量)2 引⼊serial的概念,区别前后数据包是否连续,主要应⽤于seek操作。3 设计了两类特殊的packet——flush_pkt和nullpkt(类似⽤于多线程编程的事件模型——往队列中放⼊ flush事件、放⼊null事件),其在⾳频输出、视频输出、播放控制等模块时也会继续使用到其来队列控制1 内存

2022-04-25 17:21:25 659

原创 ffplay 源码剖析 -1 框架分析

ffplay.c的意义ffplay.c是FFmpeg源码⾃带的播放器,调⽤FFmpeg和SDL API实现⼀个⾮常有⽤的播放器。 例如哔哩哔哩著名开源项⽬ijkplayer也是基于ffplay.c进⾏⼆次开发。ffplay框架分析(和前面800行代码写一个播放器逻辑很相似)黄线框 表示不同的线程控制初始化初始化packet queque 初始化frame queque初始化clock创建数据读取线程线程划分1 数据读取线程打开媒体⽂件打开对应码流的decoder以及初始化对应的a

2022-04-14 10:16:49 438

原创 使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-4主函数 主要逻辑的构建书写

要测试代码 获取测试数据的方式//ffmpeg -i sound_in_sync_test.mp4 -pix_fmt yuv420p 720x576_yuv420p.yuv//ffmpeg -i sound_in_sync_test.mp4 -vn -ar 44100 -ac 2 -f s16le 44100_2_s16le.pcm3个输入参数1 in_pcm 2 In_yuv 3 out_mp4if(argc != 4) { printf("usage -> exe in

2022-04-13 23:01:54 731

原创 使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-3音频重采样

主要代码 这个逻辑简单 (S16 -> FLTP(AAC 默认格式))AudioResampler 类的定义extern "C"{#include "libavcodec/avcodec.h"#include "libswresample/swresample.h"#include "libavformat/avformat.h"}AVFrame* AllocFltpPcmFrame(int channls,int nb_samples);void FreePcmFrame(A

2022-04-13 22:22:08 481

原创 使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-2 AV_Encoder

编码器的主要作用1 初始化编码器2 编码3 获取每一帧数据4 返回相关的参数AudioEncoder 类的定义( 视频的逻辑差不多 相对于的注解就写了一部分)av_rescale_q () 时间基转换函数 不同时间基之间的转换#include <vector>extern "C"{#include "libavformat/avformat.h"#include "libavcodec/avcodec.h"}class AudioEncoder{public:

2022-04-13 22:12:50 465

原创 使用C++ 封装一个FFmpeg通用性Muxer和Encoder组件-1主要功能和Muxer

1 具体功能如图所示 把一个pcm 文件和一个 yuv 文件合成一个MP4 文件2 具体需求1 Muxer2 AudioEncoder3 VideoEncoder4 设置统一的time_base 保证同步问题具体步骤 1 Muxer 类的封装(每个主要代码附近都有注释)Muxer 的需求1 创建流2 写入流3 写入Mp4文件Muxer类的定义#include "iostream"extern "C"{#include "libavformat/avformat.h"

2022-04-13 21:52:21 698

原创 Pycharm连接服务器运行代码(非保姆级版本)

网上一抄2 2抄3 错误的一大堆导致我搞的贼鸡儿奇怪 自己写一个自己总结的大逻辑首先 在运作程序的时候需要配置环境的一般是2处 而如果加了服务器无疑就是加了一个连接罢了也就是3处常规两处 (一般第二处不需要改)服务器连接第一次连接 或者选择新环境时候的步骤按照步骤进去选择环境即可连接服务器后续继续用环境 (很简单)这里是很多教程是地狱。。。。第一步 进来先换环境 12 自己设置好映射路径3 Deplpyment 中选择和 把刚刚的映射路径写上去

2022-04-13 10:35:43 302

原创 指针数组-数组指针

指针数组-数组指针这个问题本科我就完全不懂 最近抽时间搞明白了简单解释指针数组 array of points 数组里面都是指针就像二维数组里面 每个二维数组的一维向量 其实都是一个指针 指向了其中的值指针数组 a pointer to an array 一个指向数组的指针代码逻辑a 中的每个元素就是 arry 中每个元素的地址b 就是一个指向arry数组的指针 他里面保存的是arry地址也就是arry 第一位的地址using namespace std;int main

2022-03-22 16:35:39 127

原创 WebRTC-本地简单端到端视频通话demo

#内容概述前文说了 端到端的概念简单代码写一个demo基础界面<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>本机端到端连接测试</title> <link href="./css/main.css" rel="stylesheet" /></head><body><

2022-03-19 12:52:52 466

原创 WebRTC-搭建一个简单的信令服务器-聊天室

信令服务器在端到端之间传递媒体相关信息在端到端之间传递网络相关信息在端到端之间传递相关操作等使用类库 socket.io最主要的是 1 有房间概念2 跨平台 跨终端 垮语言Socket.io 相关用到APISocket.io 服务端 socket.emit(); //给本次连接发送消息 io.in(room).emit()//房间内所有人 socket.to(room).emit();//除自己之外 socket.broadcast.emit();//除

2022-03-19 11:36:10 812

原创 WebRTC-端到端连接的基本流程

思路A端和B端通讯 -》signal是信令服务器 -》sturn/turn 给NAT打洞的步骤 A端首先创建 对应的 peerConnect 创建一个实例然后创建流 把流添加到peerConnect 连接里面去创建一个offer 的SDP把上文的SDP 设置到创建的 localDescirption 里面,有自己对于媒体编解码等设备支持的基本信息然后请求ip 收集condidate最后发送自己的 SDP 也就是上面 offer 中的各种信息 发送给信令服务器步骤B端B收到A的S.

2022-03-18 16:55:29 1067

原创 linux 日常操作记录

linux 服务器增加新磁盘linux 锐捷网卡突然不是ethx 变成奇奇怪怪的pytorch tf2.x

2022-03-16 16:53:41 101

原创 webrtc学习-3 音视频获取+约束+分析流保存视频

首先定义基础界面和初始化一些视频约束具体功能有 播放视频 录制视频 获取视频流的轨信息 录制视频 下载视频 播放视频 <title>WebRTC capture video and audio</title> <style> .none { -webkit-filter: none; } .blur { -webkit-filter: blur(3px)

2022-03-16 16:19:24 993

原创 如果没有https 如何打开浏览获取mediaDevices的权限

http://外网ip 对于浏览器而言默认权限是关闭的而且无法开启 对于MediaDevice的权限 所以自己做测试的话可以这样!1 强行改为 https://2 点击不安全 点击网址设置 进去就可以打开权限了

2022-03-14 16:43:01 868

原创 WebRTC回顾学习 1 - 浏览器获取到mediaDevices信息

相关APInavigator.medioDevices.enumerateDevices() .then(回调) 成功 .catch(回调) 失败返回的结果一般为;deviceInfo 包含 kind: 种类 label: 标签 id 和 groupID基础执行代码JS代码'use strict'var audioSource = document.querySelector("select#audioSource");var audioOutput = document

2022-03-14 16:38:37 166

原创 ffmpeg多线程简单播放器-主要函数梳理

主要是后面几个函数首先是 主函数 基础定义VideoState *is;is = av_mallocz(sizeof(VideoState)); if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) { fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError()); exit(1); } is->pictq_mutex

2022-03-11 02:20:48 3148

原创 ffmpeg多线程播放器-代码业务逻辑

搞了很久我觉得还是画个思维导图最合适也就是前面 线程分布的细化 把函数带入其中播放器流程代码 (没有音视频同步的) 函数之间大致逻辑如上图所示基于主要函数作用 细化 见下一篇各项函数梳理#include <stdio.h>#include <assert.h>#include <math.h>#include <SDL2/SDL.h>#include <libavutil/avstring.h>#include <li

2022-03-11 02:15:02 193

原创 ffmpeg简单多线程播放器- 音视频同步(视频同步到音频)

音视频同步-主要代码逻辑也就是你追我敢的过程因为音频格式sample channel rate 都是固定的 所以 某一段音频时间是可以确定的,所以一音频为基准 视频同步到音频常规做法: 展示一帧视频帧后,得到下一帧视频帧的PTS, 和当前音频的时钟锁一个比较,如果在之前那就立即播放,如果在之后那就设置一个delay ,然后设置进定时器,当定时器超时后,刷新新的视频帧。 av_frame_get_best_effort_timestamp(pFrame)) 可以直接获得一个对应AvFrame 中获

2022-03-11 01:46:04 4051

原创 FFmpe写一个多线程播放器1 基础逻辑和队列定义

FFmpeg

2022-03-10 19:54:41 264

原创 YUV+PCM->H264+AAC-> MUX -> FLV 非0基础版本

YUV PCM ->FLV

2022-03-08 00:57:06 378

原创 FFmpeg video编码 yuv_h264 (多线程 和profile 定义)

函数说明:avcodec_find_encoder_by_name:根据指定的编码器名称查找注册的编码器。 avcodec_alloc_context3:为AVCodecContext分配内存。 avcodec_open2:打开编解码器。 avcodec_send_frame:将AVFrame⾮压缩数据给编码器。。 avcodec_receive_packet:获取到编码后的AVPacket数据。 av_frame_get_buffer: 为⾳频或视频数据分配新的buffer。在调⽤这个函

2022-03-07 19:42:54 1469

原创 H264编码(看完书在补充)

视频为什么需要进行编码压缩一张为720x480的图像,用YUV420P的格式来表示,其大小为:720 x 480 x 1.5 约等于0.5MB。如果是25帧,10分钟的数据量0.5M x 10 x 60 x 25 = 7500MB >7GB视频编码压缩的目的是降低视频数据大小,方便存储和传输为什么压缩的原始数据一般采用YUV格式视频编码是对一张张图像来进行的。我们知道彩色图像的格式是 RGB 的,但RGB 三个颜色是有相关性的采用YUV格式,利用人对图像的感觉的生理特性,对

2022-03-07 15:23:24 967

原创 FFmpeg音频重采样(复杂版)

ffmpeg

2022-03-06 01:54:18 600

原创 FFmpeg_avio 内存输入模式

当我们需要发送一些自定义的协议 (并不是一些标准的协议)去解析解码的时候 这个时候就有需要自定义avio_alloc_context()avio_alloc_context()这个结构体里面的 read_packet和write_packet是函数指针,指向⽤户编写的回调函数。可以自行重新设定 使用read_packet 做个demo 实验 AVIOContext *avio_ctx = avio_alloc_context(io_buffer, BUF_SIZE, 0, (vo

2022-03-05 14:46:56 481

原创 FFmpeg解封装通用代码

先定义好需要的类型 AVFormatContext *ifmt_ctx = NULL; int video_index = -1; int audio_index = -1; AVPacket *packet = NULL; int ret = 0; char errors[ERROR_STRING_SIZE+1];初始化 AVFormatContextifmt_ctx = avformat_alloc_context(); ret = avformat

2022-03-04 23:37:23 299

原创 ffmpeg从MP3/AAC中抽取PCM 数据

流程如下代码逻辑 const char *outfilename; const char *filename; const AVCodec *codec; AVCodecContext *codec_ctx = NULL; AVCodecParserContext *parser_ctx = NULL; int len = 0; int ret = 0; FILE *infile = NULL; FILE *outfile

2022-03-03 22:23:44 613 2

原创 C语言CURL网络连接 为了下载做准备

难点补充1oid SendRequest(RequestContext *request_context) { if (request_context->is_running) { PRINTLNF("request already running ...."); return; } CURL *curl = curl_easy_init(); if (!curl) { request_context->curl_code = -1; ret

2022-03-02 22:28:05 588

原创 C语言使用 sqlite数据库

sqlite 导入 使用conan 一行代码就可以sqlite3/3.32.3具体使用创建基本的增删改查#ifndef BASICC_DOWNLOADER_SQLITE_MANAGER_H_#define BASICC_DOWNLOADER_SQLITE_MANAGER_H_#include "basics.h"#include <sqlite3.h>#include <glib.h>#define MAX_SQL_LENGTH// 用来解析数据的 做一些

2022-03-02 15:10:53 2081

原创 C语言计算 MVC +CSS+GTK(非进栈出栈版本)

如图所示可以连乘 连续处于 +科学技术法 等采用MVC架构 两套UI输入输出 控制台和GTK UI项目地址—https://github.com/zycccer/Calcuator记录一个小写法 C语言对于函数封装 就像Cpp 模板函数 java 泛型#define input_0 "0"#define input_1 "1"#define input_2 "2"#define input_3 "3"#define input_4 "4"#define input_5 "5"#.

2022-03-01 21:26:55 359

原创 C语言写一个计算器 计算逻辑

//////// Created by zyc on 2022/2/27.////////#include “calculator.h”//#include “stdlib.h”//#include <string.h>//#include <stdio.h>///**// *// * @param context// * @param input_value// * @return 判断输入值是否合法// ///int HandleInput(CalcC

2022-03-01 21:07:51 1215

原创 C语言写一个计算器 MVC(很有意思的代码架构 回调以及构造器模式 以及指针函数的使用)

计算器

2022-02-28 14:55:01 493 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除