- 博客(55)
- 资源 (167)
- 收藏
- 关注
原创 LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了
Go语言流媒体开源项目今天发布了v0.35.4版本。LAL 项目地址:https://github.com/q191201771/lal。
2023-04-18 20:09:58
485
原创 LAL v0.34.3发布,G711音频来了,Web UI也来了
Go语言流媒体开源项目今天发布了v0.34.3版本。LAL 项目地址:https://github.com/q191201771/lal。
2023-03-28 13:55:04
348
原创 LAL v0.32.0发布,更好的支持纯视频流
Go语言流媒体开源项目 [LAL](https://github.com/q191201771/lal) 今天发布了v0.32.0版本。距离上个版本刚好一个月时间,[LAL](https://github.com/q191201771/lal) 依然保持着高效迭代的状态。
2022-11-11 09:42:24
570
原创 开源Golang rtmp服务lalserver支持多种鉴权防盗链方式
lalserver是纯Golang开发的流媒体服务器。支持RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]/WebSocket[S]-FLV/TS协议。目前已支持多种鉴权防盗链的方式。lal github地址: https://github.com/q191201771/lal▌ 方式一. 固定值的鉴权参数首先,修改配置文件,如下:"conf_version": "v0.2.6",..."simple_auth": { "key": "q191201771", .
2022-04-05 18:56:40
4846
原创 Golang 流媒体音视频网络传输开源项目-LAL
一. lal 简介lal是开源直播流媒体网络传输项目,主要由三部分组成:lalserver:流媒体转发服务器。类似于nginx-rtmp-module等服务,但支持更多的协议,提供更丰富的功能。demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等。类似于ffmpeg、ffprobe等应用。pkg:流媒体协议库。类似于ffmpeg的libavformat等库。lal github地址: https://github.com/q191201771/lal以下是lal
2022-02-22 19:27:34
3602
原创 LAL-开源Go语言音视频流媒体服务器
https://github.com/q191201771/lal中文文档LAL is an audio/video live streaming broadcast server written in Go. It’s sort of like nginx-rtmp-module, but easier to use and with more features, e.g RTMP, RTSP(RTP/RTCP), HLS, HTTP[S]-FLV/HTTP-TS, WebSocket-FLV/TS,
2021-04-24 13:27:45
884
原创 常见推拉流客户端使用方式
1 rtmp推流1.1 obs1.1.1 obs采集摄像头1.2 ffmpeg1.2.1 ffmpeg读取文件推送2 rtsp推流2.1 ffmpeg2.1.1 ffmpeg读取文件推流3 rtmp拉流3.1 vlc3.2 ffmpeg3.2.1 ffmpeg拉流保存文件3.3 ffplay3.4 mpv3.5 srs提供的rtmp播放页面(基于adobe flash技术)4 http-flv和https-flv拉流5 HLS(m3.
2021-02-17 11:29:26
4546
原创 redis源码阅读之面向哈希表优化
写在前面2020年了,给自己加个任务,把redis代码完整读一遍。我新建了一个github项目(地址在文章末尾),会在redis源码之上增加注释,后续也会为其中一些值得拎出来说的点单独写文章。本文内容:常规哈希表科普 redis rehash面临的问题 redis的渐进式hash 什么时候会启动rehash 如何渐进式rehash 什么时候执行一步rehash reh...
2020-01-11 13:07:19
143
原创 [译] Go语言使用TCP_NODELAY控制发包流量
编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。TCP/IP协议栈中的一些算法会影响到服务性能。本文将简单介绍其中的Nagle算法,与Nagle算法相关的socket选项TCP_NODELAY,以及在Go语言中如何使用它。理论大部分平台上的TCP实现...
2020-01-01 09:36:03
711
原创 利用CPU cache特性优化Go程序
demo如下Go语言伪代码,开启两个协程,分别对一个结构体变量中的两个相邻的数据成员进行n次原子自增操作,当打开_ [56]byte这个看似多余的代码后,程序运行速度加快了一倍!你知道是为什么吗?...type Foo struct { a uint64 // _ [56]byte b uint64 // _ [56]byte}...go fu...
2019-12-29 19:05:35
245
原创 Go语言channel备忘录
目录无缓冲channel等价于缓冲大小为0的channel,而不是1 发送者和接收者哪些情况会阻塞 close哪些情况会导致panic 如何优雅的关闭channel 当一个select中有多个channel满足可读时,谁被激活 select with default 读取时获取第二个返回值,以此判断该channel是否被关闭 close前写入的数据,接收者依然可以按顺序读取到 ...
2019-12-22 09:39:30
214
原创 [译] Go语言的有缓冲channel和无缓冲channel
Go中的channel十分强大,理解channel的内部机制后再去使用它可以发挥出更大威力。另外,选择使用有缓冲channel还是无缓冲channel会影响到我们程序的行为表现,以及性能。无缓冲channel无缓冲channel在消息发送时需要接收者就绪。声明无缓冲channel的方式是不指定缓冲大小。以下是一个列子:package mainimport ( "sync" "...
2019-12-21 08:46:11
574
原创 Go语言使用cgo时的内存管理笔记
先放结论使用cgo时:和日常Go对象被gc管理释放的表现略有不同的是,Go和c代码的类型相互转化传递时,有时需要在调用结束后手动释放内存。 有时类型转换伴随着内存拷贝的开销。 如果想消除拷贝开销,可以通过unsafe.Pointer获取原始指针进行传递。 c代码中的内存泄漏,依然可以使用valgrind检查。但是需要注意,像C.CString这种泄漏,valgrind无法给出泄漏的准...
2019-12-21 08:41:27
1423
原创 CentOS7升级内核以开启TCP BBR拥塞控制算法
通过ELRepo RPM repo升级内核查看当前内核版本$uname -r输出如下:3.10.0-514.26.2.el7.x86_64说明当前的内核为 3.10.0安装ELRepo repo$sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org$sudo rpm -Uvh http...
2019-12-14 11:55:31
518
原创 [译] 写一个简单的内存分配器(替换glibc中的malloc函数)
本文介绍如何用c语言实现一个简单的内存分配器,可替换glibc中的 malloc(), calloc(), realloc(), free().这是一篇入门级别的文章,所以不会介绍所有的细节。 代码实现主要为了演示内存分配器的基本工作原理,所以和工业级内存分配器相比,缺少非常多的性能优化,分配内存时也不会按页对齐,但是至少,我们构建的内存分配器是可以工作的。在构建内存分配器之前,需要先介绍...
2019-12-13 22:04:28
517
原创 使用supervisor工具对服务进程做保活管理
使用supervisor工具对我们的非daemon程序做保活,当我们的进程崩溃了或被误杀了后能再次被自动拉起。CentOS 安装 supervisor$yum install supervisor -y安装完成后,使用如下命令生成默认配置文件/etc/supervisord.conf:$echo_supervisord_conf > /etc/supervisord.c...
2019-12-07 13:23:14
254
原创 [译] 理解存储性能的两个指标每秒读写次数与时延
大部分人在考虑存储性能时,他们首先想到的是最大吞吐量。但是最大吞吐量就像汽车厂商给汽车标的最高速度。实际上,你几乎永远不会达到那个速度。考虑存储性能时也不应该只考虑最大吞吐量。还拿汽车来举例,大部分时候,加速度和过弯的处理能力可能会比最大吞吐量更重要。这和存储性能是类似的。大部分人都知道SSD固态硬盘一般比普通的机械硬盘快。但这不仅仅是因为固态硬盘的最大吞吐量更大。还和它们的IOPS(In...
2019-12-01 10:49:37
2095
原创 [译] linux内存管理之RSS和VSZ的区别
RSS是Resident Set Size(常驻内存大小)的缩写,用于表示进程使用了多少内存(RAM中的物理内存),RSS不包含已经被换出的内存。RSS包含了它所链接的动态库并且被加载到物理内存中的内存。RSS还包含栈内存和堆内存。VSZ是Virtual Memory Size(虚拟内存大小)的缩写。它包含了进程所能访问的所有内存,包含了被换出的内存,被分配但是还没有被使用的内存,以及动态库中...
2019-11-30 10:51:00
4015
原创 Go语言源码阅读之bytes.Buffer
Go标准库中的bytes.Buffer(下文用Buffer表示)类似于一个FIFO的队列,它是一个流式字节缓冲区。我们可以持续向Buffer尾部写入数据,从Buffer头部读取数据。当Buffer内部空间不足以满足写入数据的大小时,会自动扩容。伸缩策略....................................... ^ ^...
2019-11-28 13:30:58
204
原创 Go创建对象时,如何优雅的传递初始化参数
Go创建对象时,如何优雅的传递初始化参数?这里所说的优雅,指的是:支持传递多个参数 参数个数、类型发生变化时,尽量保持接口的兼容性 参数支持默认值 具体的参数可根据调用方需关心的程度,决定是否提供默认值Go并不像c++和python那样,支持函数默认参数。所以使用Go时,我们需要一种方便、通用的手法来完成这件事。Go的很多开源项目都使用Option模式,但各自的实现可能有些许细微差...
2019-11-27 13:23:09
710
原创 [译] TCP的SYN队列和Accept队列
关于两个队列首先我们必须明白,处于“LISTENING”状态的TCP socket,有两个独立的队列:SYN队列(SYN Queue) Accept队列(Accept Queue)这两个术语有时也被称为“reqsk_queue”,“ACK backlog”,“listen backlog”,甚至“TCP backlog”,但是这篇文章中我们使用上面两个术语以免造成混淆。SYN队...
2019-11-23 22:35:49
369
原创 [译] Go开源项目BigCache如何加速并发访问以及避免高额的GC开销
几天前,我读了一篇关于BigCache的文章,我对它是如何做到以下两点十分感兴趣:加速并发访问 避免高额的GC开销于是我去阅读了它的代码。我觉得它的做法很赞,所以我写了这篇文章来与你分享。BigCache 是一个快速,支持并发访问,自淘汰的内存型缓存,可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 —— 摘自《BigCache README ...
2019-11-21 18:52:17
912
原创 给Go程序加入编译版本时间等信息
先看效果$./myapp -vGitCommitLog=d97d098e5bb4ad38a2a7968f273a256e10a0108f mod bininfo commentGitStatus=cleanlyBuildTime=2019.10.26.194341GoVersion=go version go1.13 darwin/amd64runtime=darwin/amd64...
2019-10-27 10:26:39
1048
翻译 [译] Go语言测试进阶版建议与技巧
阅读本篇文章前,你最好已经知道如何写基本的单元测试。本篇文章共包含3个小建议,以及7个小技巧。建议一,不要使用框架Go语言自身已经有一个非常棒的测试框架,它允许你使用Go编写测试代码,不需要再额外学习其它的库或测试引擎。关于断言方面的帮助函数,你可以看看这个 testing,或者这个 assert.go ????建议二,使用"_test"包名相较于直接使用被测试代码的包名,使用 *_test包...
2019-09-15 17:19:23
167
原创 stress - 系统压力模拟工具
欢迎访问我的个人网站获取更佳排版体验: https://pengrl.com/p/42434/ (stress - 系统压力模拟工具 | yoko blog)前言stress是一个故意制造系统压力的工具。它提供了一系列的参数用于配置如何制造CPU,内存,IO操作,磁盘压力。安装# centos平台$yum install epel-release$yum install stress...
2019-07-06 09:08:14
1198
1
翻译 [译] QUIC Wire Layout Specification - Packet Types and Formats | QUIC协议标准中文翻译(2) 包类型和格式
欢迎访问我的个人网站获取更佳阅读排版体验: [译] QUIC Wire Layout Specification - Packet Types and Formats | QUIC协议标准中文翻译(2) 包类型和格式 | yoko blog (https://pengrl.com/p/48146/)目录QUIC Public Packet Header | QUIC公共包头Public...
2019-06-08 08:48:45
566
1
原创 [译] Go References - The Go Memory Model | golang官方文档中文翻译之内存模型
本文同步发布于: [译] Go References - The Go Memory Model | golang官方文档中文翻译之内存模型 | yoko blog前言本篇译文对应的原文标题:The Go Memory Model - Go References作者:Go官方文档地址:https://golang.org/ref/mem本文标明yoko备注的内容是我自己写的备注,其...
2019-04-23 14:47:12
523
1
原创 golang的channel和条件变量在单生产单消费场景下的性能对比测试
本篇文章同步发布于:golang的channel和条件变量在单生产单消费场景下的性能对比测试 | yoko blog本文相应的代码附在文章末尾处。场景描述1个生产者只与1个消费者相互绑定。生产者按固定生产频率,每间隔<PRODUCE_INTERVAL_MS>毫秒生产一个任务。生产者每次生产时都检查当前任务队列大小,如果已经超过<QUEUE_NUM_CANCEL_PRO...
2019-04-18 10:38:20
1352
原创 #ifndef#define#endif防止头文件重复包含, 你不是真的懂
注:以下所用环境皆为VS2005, 由于本人表达能力有限, 大家有看不懂的地方可以多看几遍 这里首先说明下几点基础知识, 相信大部分人对于以下几点大部分都已经知道了, 你也可以直接跳到最后部分看#ifndef#define#endif的真正作用 1.预编译阶段把所有#include ”***.h“ (“”与的区别这里就不说了)用***.h的内容来替换了, 所以之后就没有.h了所有.h的内容都已经包含进了需要它们的.cpp中(注:该步个人认为是发生在预编译阶段) 2.生成最后的exe文件是由编译、链接
2011-05-06 14:35:00
37240
31
原创 鸡尾酒排序
<br />void sort(int arr[], int len){ bool flag = true; int temp; while(flag) { flag = false; int bottom = 0; int top = len - 1; int i; for(i=bottom; i < top; ++i) { if (arr[i] > arr[i+1]) { temp = arr[i]; a
2011-04-19 11:40:00
1085
1
原创 Windows下调试信息 TRACE OutputDebugString
有的时候程序并没有控制台, 这时打印肯定是不行了, 写文件是个通用的方法, 但比较适合系统上线或者只能使用该方法调试时, windows下有两个打印调试信息的函数, TRACE OutputDebugString TRACE貌似只能在MFC中使用, 但是可以像printf那样构造字符串 OutputDebugString需要先构造好字符串再把字符串传入打印出来, 但是只要包含了windows.h 就能使用了, 两个函数都是在调试状态下把信息打在output中, 即我们在使用VC时编译时显示编译信息进
2011-04-19 11:06:00
3840
1
原创 AutoLock 解决加锁后忘记解锁问题
class AutoLock{public: AutoLock(CRITICAL_SECTION& cs) : cs_(cs) { EnterCriticalSection(&cs_); } ~AutoLock() { LeaveCriticalSection(&cs_); }private: CRITICAL_SECTION& cs_;};class Test{public: Test() { InitializeCriti
2011-04-19 10:52:00
2646
1
原创 宏编译 预处理头 WIN32_LEAN_AND_MEAN
<br /> 在许多windows下的项目中, 我们经常可以看到在stdafx.h中有这么个宏定义#define WIN32_LEAN_AND_MEAN, 它的作用实际上是当我们项目中包含了<windows.h>时去除一些头文件的包含, 加快编译速度, 大家可以跳进<windows.h>中搜索一下WIN32_LEAN_AND_MEAN就能看到去除了哪些头文件的包含了, 据网上说是不使用MFC时可以包含该预处理头, 我也用个小项目测试了一下, 基本上对于编译速度以及生成文件没有多大影响, 所以个人认为大家只
2011-04-19 10:23:00
8029
原创 ACE配置IPv6, VS静态编译ACE库
使用自己下载的6.0.1版本只需在ACE_wrappers/ace/config.h(没有请自行创建)中添加#define ACE_HAS_IPV6再编译ACE_wrappers_vc8.sln即可, 下面贴出的是我自己的config.h, 具体config有哪些配置及其含义请参照ace目录下的readme文件#define ACE_HAS_STANDARD_CPP_LIBRARY 1 #define ACE_HAS_IPV6#include "ace/config-win32.h"
2011-03-24 20:58:00
3459
1
原创 获取本机所有ipv4, ipv6地址
<br /> 从在线版msdn搜getaddrinfo扒下来改了一下, witch says, function gethostbyname() doesn't work well with ipv6.<br />#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <iostream>#pragma comment (lib, "Ws2_32.lib")int __cdecl main(int a
2011-03-22 12:25:00
4845
原创 win7注册进程外组件, 服务, 以及COM组件调试
<br /> 折腾了一天, 原来又是系统搞的鬼, 在win7下使用/regserver, /service, regsvr32.exe时, 会失败, 尤其使用regsvr32.exe时, 会弹出对话框模块"***"已加载, 但找不到入口点DllRegisterServer, 这都是win7权限惹的祸, 解决方法 开始->所有程序->附件->找到命令提示符右键选择管理员权限打开, 这样就可以注册组件了, 另外不知道可不可以把当前用户的权限设置成最高权限, 虽然我使用的用户是管理员用户, 但是还是得通过右键那
2011-03-16 19:56:00
5984
1
原创 windows工具mstsc远程桌面连接, 方便的在两台电脑间互相拷贝文件
<br /> 使用这个windows小工具就可以连接另一台windows电脑并且远程桌面控制它了, 前提是被连接的电脑需要开启远程桌面功能, 以我自己的win7系统为例(xp应该也在差不多的位置), 右键计算机 -> 属性 -> 远程设置 -> 远程桌面里选定允许<br /> <br /> 然后再在连接方 运行 里输入mstsc打开mstsc工具, 输入被连接方的IP, 被连接方允许用来连接的账号, 密码, 这里有一个非常值得一提的地方, 当我们想自由方便的在连接方与被连接方传输文件时, 可以在打开ms
2011-03-13 09:35:00
17040
2
原创 屏蔽不显示VS警告warning
<br />用VS编译项目时如果感觉有些警告太多或太烦人, 可以屏蔽该警告<br />注:假设需要屏蔽的warning号为8888<br />第一种方法, 在代码中加入#prama warning(disable:8888)<br />第二种方法, VS编译器中设置, 以VS2005为例, 打开项目属性-> c/c++ -> Advanced -> Disable Specific Warnings 输入8888
2011-03-12 17:30:00
25326
4
原创 windows API 返回错误值的查看及打印
<br />第一种, 相信大家都和熟悉了, 打开VS的Tools菜单下的Error LookUp工具, 将GetLastError()返回的错误值输入就能获取错误信息了<br />第二种, 进入调试模式, 在Watch窗口中选择一行, 输入$err,hr 这样windows API出现错误时就会现在错误值以及对应的错误信息了, 这样就省去了GetLastError(), 在写一些小demo测试的时候比较管用<br />第三种, 我们要结合windows的另一个函数FormatMessage, 下面我贴出一段
2011-03-08 19:35:00
1921
1
原创 创建自定义自启动LINUX服务service
1.将init_daemon放入程序开始处void init_daemon(){ int pid; int i; if(pid=fork()) exit(0);//是父进程,结束父进程 else if(pid 2.将chefd文件(如下)放进etc/init.d
2011-01-13 13:25:00
6093
2
物流app源代码(用户)
2021-04-12
Enfocus_PitStop_Pro_10_Update2_Patch
2021-04-10
最完美的select美化下拉框
2021-04-09
中科院机器学习课件ppt
2021-04-05
java socket查询数据库实现登录验证
2021-04-04
基于VS2010的CSocket网络文件传输
2021-04-01
UML课程设计(报告+建模.mdl文件)
2021-03-30
leetcode全套解答python版本
2021-03-29
STM32 PWM多路定时器输出
2021-03-27
java游戏源代码:11个小游戏的源码集合
2021-03-19
直接序列扩频通信系统仿真设计
2021-03-08
Tomcat+MySQL为自己的APP打造服务器(4)完结篇Demo
2021-03-05
android黄历数据库
2021-03-03
c#采集摄像头图像源码
2021-03-02
ocx控件开发经典例子
2021-03-01
themeservice.dll themeui.dll uxtheme.dll
2021-02-24
Swing 组件大全
2021-02-21
超级简单实用的ASP文件管理系统(一个ASP程序实现所有功能)
2021-02-18
H+V4.9 响应式后台主题UI框架(官方原版代码)带完整文档
2021-02-17
matlab做软件界面
2021-02-15
SkSockServer
2021-02-14
带有约束条件的遗传算法程序
2021-02-13
魔兽世界插件编写教程与资料
2021-02-07
操作系统原理(第四版)课后练习题答案
2021-01-28
89个课件 Flash 源文件下载
2021-01-27
C#解析HL7消息的库
2021-01-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人