- 博客(48)
- 收藏
- 关注
原创 rtmp数据封装四-音频(AAC&G711)
前面文章《rtmp数据封装一-块(chunk)》中讲到rtmp传输媒体数据时是把一整帧数据拆分成chunk的形式发送的。其实一帧媒体数据在拆分成chunk之前还需要进行必要的头部信息封装,本文介绍rtmp协议中AAC/G.711音频数据的头部信息封装。第一个byte包含音频的编码参数:1-4bit: audioCodeId5-6bit: 采样率 00 5.5KHZ, 01 11...
2018-08-21 00:18:08
4659
5
原创 rtmp数据封装三-视频(H264&H265)
前面文章《rtmp数据封装一-块(chunk)》中讲到rtmp传输媒体数据时是把一整帧数据拆分成chunk的形式发送的。其实一帧媒体数据在拆分成chunk之前还需要进行必要的头部信息封装,本文介绍rtmp协议中H.264/H.265视频数据的头部信息封装。H.264 rtmp头部信息封装SPS PPSAVCDecoderConfigurationRecordframe t...
2018-08-21 00:16:34
3689
2
原创 简易的个人博客网站-Hexo安装、部署到github和coding
以前我都是把技术博客发布在优快云,后来突然有个想法就是自己买个域名并搭建个人博客网站。可以搭在自己的云服务器上,或者可以直接在github或者coding创建项目,把代码部署上去一样可以在上面搭建网站。我的个人博客网站是用hexo生成的,hexo用于搭建个人博客网站很方便,下面简单介绍一下方法。这里随便推广一下我的个人博客网站,可以看看效果 灵动的指针hexo安装apt-get in...
2018-08-20 10:36:55
594
原创 rtmp数据封装二-AMF
简介rtmp协议在传输script数据onMetaData时使用AMF(Action Message Format)格式封装。AMF_TYPE对应的编号:0 : AMF_NUMBER1 : AMF_BOOLEAN,2 : AMF_STRING,3 : AMF_OBJECT,4 : AMF_MOVIECLIP,5 : AMF_NULL,6 : AMF_UNDEFINED,...
2018-08-20 09:54:09
1274
原创 rtmp数据封装一-块(chunk)
简介由于一帧音视频数据有时候会很大,比如几十M甚至更大。但是为了方便在网络上传输,需要把数据拆分成一个个较小的块,这里称之为消息块(Chunk)。常见的是每块大小为4000 byte左右。Chunk的结构如下:[Chunk Basic Header][Chunk Message Header][Extended TimeStamp][Chunk Data][Chunk B...
2018-08-20 09:53:20
2126
原创 rtmp信令交互过程分析七-音视频数据(video audio data)
概述在传输完元数据onMetaData之后就开始传输音视频数据了,如视频是H.264编码,第一帧视频帧需要是SPS和PPS,后面才是I帧和P帧。如果是发布端向服务器推流,方向是C->S,如果是播放器向服务器拉流,方向是S->C。音视频数据包的封装后面的文章在详谈,这里只是讲信令交互。举例发布端向服务器推流 C->SVideo DataRTMP ...
2018-08-20 09:52:13
1539
原创 rtmp信令交互过程分析六-元数据(onMetaData)
概述在publish或者play之后就是开始传输媒体数据了,媒体数据分为3种,script脚本数据、video视频数据、audio音频数据。首先需要传输的是脚本数据onMetaData,也称为元数据。onMetaData主要描述音视频的编码格式的相关参数。如果是发布端向服务器推流,则onMetaData的方向是C->S,如果是播放器向服务器拉流,则onMetaData的方向是S-&g...
2018-08-20 09:51:17
2807
1
原创 rtmp信令交互过程分析五-播放(play)
概述连接成功之后由客户端选择publish还是play,这里讲的是play。1、C->S : createStream2、S->C : _result服务端对客户端createStream请求的反馈3、C->S : getStreamLength、play、Set Buffer LengthgetStreamLength:获取stream的时间长度pl...
2018-08-20 09:50:09
1829
原创 rtmp信令交互过程分析四-发布(publish)
概述连接成功之后由客户端选择publish还是play,这里讲的是publish。1、C->S : releaseStream、FCPublish、createStreamreleaseStream:释放stream,这一步的作用是通知服务端释放对应的stream,以便接下来重新创建stream。FCPublishcreateStream2、S->C : _re...
2018-08-20 09:49:25
2794
原创 rtmp信令交互过程分析三-连接(connect)
概述握手之后就是连接(connect),由客户端发起,服务端响应,connect指定的app。1、C->S : connectapp:需要connect的app名称flashVertcUrlfpadcapabilitiesaudioCodecsvideoCodecsvideoFunction2、S->C : Window Acknowledgement...
2018-08-20 09:48:27
1926
原创 rtmp信令交互过程分析二-握手(Handshake)
rtmp信令第一步是握手(Handshake),握手有Simple Handshake和Complex Handshake,Simple Handshake为简单握手,不需要使用加密算法校验,Complex Handshake为复杂握手,需要使用openssl的算法校验。一、Simple Handshake概述1) C0 1 byte,表示客户端RTMP的版本号。2) C1...
2018-08-20 09:47:22
1266
原创 rtmp信令交互过程分析一-概述
后续会写一系列关于rtmp的文章,这是第一篇信令交互的概述。使用wireshark抓包分析rtmp推流和拉流过程的信令,大致如下:通用部分箭头>>>表示C->S,箭头<<<表示S->C>>> Handshake C0+C1<&a
2018-08-20 09:46:11
1233
原创 ubuntu 64bit安装32bit兼容库
64位系统需要安装一些32位的库才能兼容32位的应用更新源dpkg --add-architecture i386apt-get update 安装apt-get install libc6:i386 apt-get install libncurses5:i386 apt-get install libstdc++6:i386apt-get install libz1:...
2018-05-08 22:44:42
1890
原创 ubuntu server 14.04和18.04挂载vmware共享文件夹
之前试过在Linux中mount -t cifs的方式挂载windows的共享目录,但这是通过网络挂载,有时拔掉网线或者IP冲突时经常掉线,有时编译大文件频繁读写时也出问题。所以就使用直接挂载vmware共享文件夹的方式,比较稳定。1、ubuntu server 14.04先在虚拟机Ubuntu系统关机的情况下配置好共享文件夹,比如我配置的文件夹是linux_shared。然后开启Ub...
2018-05-08 22:42:30
2923
原创 ubuntu server安装vmware-tools
ubuntu server服务器版和ubuntu desktop 桌面版安装vmware-tools最大的区别就是没有图形界面,需要通过命令行挂载才能找到vmware-tools的安装包。1、挂载拷贝安装包mkdir /mnt/vmtoolsmount -t iso9660 /dev/cdrom /mnt/vmtoolscp /mnt/vmtools/VMwareTools-10.1...
2018-05-08 22:40:07
4759
1
原创 linux socket使用ARP判断局域网指定IP是否被占用
项目中需要判断局域网内某个IP是否被占用,一开始想到的是ping命令,但是ping只能判断同一网段的IP。后来发现linux使用arping命令可以判断,如使用arping -D -f -w 1 x.x.x.x但是对于经过裁剪的嵌入式linux,busybox中不一定还保留arping命令,而且C代码中调用shell命令需要临时创建一个子进程来执行,频繁操作会浪费资源。于是决定参考busybo...
2018-05-03 17:48:09
1373
原创 Makefile C与C++混编的简单写法
用了很久的Linux,感觉还是对Makefile不够熟悉,经常为一个复杂一点的项目的Makefile折腾半天。现在对Makefile的基本写法做一下总结,方便以后查阅。这里用我近期写的一个Makefile做讲解,是一个C与C++混编的项目。并附上完整的Makefile内容。目录结构是:+--include/+--include/librtmp+--liblog/+--libr...
2018-05-03 16:59:37
2792
原创 使用gsoap编译生成onvif源码C/C++文件
1、gsoap工具编译与安装需要先安装opensslsudo apt-get install openssl sudo apt-get install libssl-dev自行下载gsoap源码并解压,进入gsoap源码下./configmakesudo make install 安装成功后可以使用wsdl2h 和soapcpp2命令 wsdl2h 命令用于生成头文...
2018-03-05 16:31:15
1341
原创 https server的ssl协议实现
1、简介HTTPS协议简单的说就是经过ssl加密的HTTP协议,本文不介绍https server中http信令的实现,只介绍ssl的实现。2、需要的库使用openssl实现ssl,需要编译openssl生成libssl.a和libcrypto.a3、API的使用需要包含的头文件#include <openssl/ssl.h>初始化,cert_pa...
2018-03-05 15:56:17
2182
原创 web无插件解码播放H264/H265(WebAssembly解码HTML5播放)
我之前写过一篇《web无插件解码播放H264/H265(js解码HTML5播放)》,与本文的项目意义基本一致,不同的是实现方案有一定差异。之前介绍的是纯JS解码,本文介绍WebAssembly解码。本项目已经用于实际产品之中,亲测可用。项目描述:视频传输使用websocket协议,ipc后端推流使用C语言编程,web前端收流使用js语言。视频解码库使用WebAssembly实现...
2018-03-04 14:42:55
48386
29
原创 JS如何调用WebAssembly的api
这里以我之前做的一个项目为例。项目是把ffmpeg编译成WebAssembly文件,然后在js中调用,实现纯前端代码软解码音视频数据。在linux下编译的一、编译ffmpeg生成静态库build_decoder.shecho "Beginning Build:"rm -r distmkdir -p distcd ffmpeg-3.3.3make cleanemconf...
2018-03-04 01:08:35
37068
13
原创 使用emscripten编译WebAssembly
需要编译的c语言demo程序add.c#include &lt;stdio.h&gt;int add(int a,int b){ return a+b;}int main(void){ printf("%d\n",add(1,2));}1、可以编译成带有html输出文件,可以直接打开html文件查看效果emcc add.c -s WASM=1 -o add...
2018-03-04 00:09:43
3818
原创 WebAssembly wabt工具安装和使用
emscripten编译生成的WebAssembly文件是*.wasm的二进制文件,不方便阅读。使用wabt工具,可以实现wasm与wast的互转,有助于理解wasm内部接口。wasm是二进制文件,可读性很差。wast是文本文件,可以看到wasm的内部接口。下载https://github.com/WebAssembly/wabt安装略。根据readme安装。...
2018-03-03 23:49:20
6557
原创 WebAssembly emscripten工具链的搭建
emscripten有多个版本,这里安装的是WebAssembly需要的版本。需要提前安装gcc、cmake、Python、node.js等,这些请自行安装。开始安装emscripten:1、下载wget https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gztar xv...
2018-03-03 23:42:12
3008
原创 WebAssembly简介
什么是WebAssembly虽然WebAssembly从名字翻译来说是web版的汇编语言,但是其实是一个二进制文件。 与asm.js相比之下,asm.js更像是web版的汇编语言,WebAssembly是web版的二进制语言,效率更高。 二者的编译工具链都是从emscripten编译而来,但是编译方法有所区别。具体在环境搭建中介绍。哪些浏览器支持WebAssemblyWebAsse...
2018-03-03 23:26:38
1555
原创 ejs模板基础用法
前言ejs是适合在node.js中生成动态页面的模板,可以根据后端数据库中的数据按照一定逻辑处理渲染页面。其实静态html页面配合js,js通过http获取后端数据后也能动态渲染页面。但是这样是有缺点的。静态页面+js 的缺点:不安全。把后端数据库的内容通过http发到前端进行解析再渲染页面,http接口容易被盗用,后端数据库数据被盗。不流畅。整个页面的渲染分2步,先加载页面文...
2018-03-03 21:38:42
1239
原创 node.js网站依赖包安装方法
需要安装的包在package.json文件中,根据此文件使用npm安装1、查看已经安装的包的列表npm list npm list -g2、查看已安装的某个包的版本npm list XXX3、安装某个包的最新版本npm install XXX npm install XXX -g4、安装某个包的指定版本x.x.xnpm install X...
2018-03-03 21:22:59
4749
原创 forever实现node.js应用在后台运行
前段时间使用node.js开发公司网站,是运行在linux系统的,一开始习惯性的认为只要在运行node.js应用的命令后面加&就可以实现后台运行,如 node app.js &,但是结果关闭终端时进程就被退出了。最终发现了forever可以实现node.js的后台运行维护,而且万一程序出错进程退出时还可以重新被拉起来。一、安装npm install -g forever...
2018-03-03 21:17:15
595
原创 mongodb数据库导出与导入
1、导出命令格式:mongodump -h dbhost -d dbname -o dbdirectory参数说明:-h: 数据库服务器地址,端口一般是27017-d: 需要导出的数据库实例名称-o: 导出的路径示例:mongodump -h 127.0.0.1:27017 -d test -o /data/mongodb_bak/2、导入命令格式:m...
2018-03-03 21:06:14
294
原创 node.js中如何使用mongodb数据库
本文介绍node.js项目中mongodb数据库的使用方法,相关目录结构是项目中的目录。代码先不上传,只介绍方法。 数据库使用mongodb mongodb的服务端的安装方法是在ubuntu执行apt-get instal mongodb,安装成功之后执行/etc/init.d/mongodb start启动。 nodejs中需要添加的组件是mongoose,里面内置...
2018-03-03 20:53:58
722
原创 flv的格式
flv封装单元是以tag来表示的,一个tag可以是音频tag或者视频tag,或者脚本tag及其其他类型。一、flv的格式flvheader脚本tag(metadata)第一个视频tag(h264_spspps)第一个音频tag(aac_header)第二个视频tag(h264第一个关键帧)后面就是音频和视频tag交互存在…二、tag的格式:[TYPE] (1b...
2018-03-03 20:35:58
496
原创 rtmp信令格式
rtmp以TCP方式推流,分为一个个消息包。一、握手 握手开始于客户端发送 C0,C1 块。 服务端在发送 S0 和 S1 之前必须等待接收 C0,也可以等待接收 C1。 服务端在发送 S2 之前必须等待接收 C1。 在发送 C2 之前客户端必须等待接收 S1 。 客户端在发送任何数据之前必须等待接收 S2。 服务端在发送任何数据之前必须等待接收 C2。1、 ...
2018-03-03 20:31:47
1296
原创 jrtplib的使用
简介jrtplib是用C++开发的rtp/rtcp库,非常方便嵌入到C++工程中,可用于rtsp server或rtsp client的开发之中,或者其他以rtp/rtcp格式的推流与收流。初始化示例代码:RTPSession rtp_session;unsigned short rtp_port = 6666;unsigned int payload_type = 96;...
2018-03-03 20:29:22
2023
原创 rtp基本封包格式
rtp包易于过大,一般每个包不要超过1400,这里设置为1380,即DEFAULT_MTU=1380这里介绍的媒体格式有视频:H264/H265,音频:AAC1、如果媒体包小于DEFAULT_MTU时可直接写入rtp包中,示例代码: unsigned char *pNAL; //媒体数据包 int nalsize; //媒体数据包长度 ...
2018-03-03 20:26:15
4517
原创 rtsp基本信令
1、OPTIONSclient->serverOPTIONS rtsp://192.168.0.158:554/video_high1080.h264 RTSP/1.0CSeq: 2User-Agent: LibVLC/2.2.2 (LIVE555 Streaming Media v2016.01.12)server->clientRTSP/1.0 200 OK...
2018-03-03 20:22:08
1906
原创 linux C 嵌套调用.a静态库注意事项
一、注意静态库的加载顺序有时嵌套调用静态库,比如在rtmp_server中需要调用到librtmp.a,而在librtmp.a中需要调用到libflv.a,此时需要注意静态库加载的顺序,需要先加载librtmp.a再加载libflv.a。具体如下:生成静态库gcc -c -o libflv.o libflv.c ar -rc libflv.a libflv.ogcc -c -o ...
2018-03-03 20:07:45
3392
原创 虚拟机ubuntu server 14.04 64bit 根目录扩容
前言为什么需要扩容?使用VMware Workstation安装linux虚拟机时需要设置虚拟的硬盘空间多大,比如一开始设置为50G,在开发过程渐渐的觉得50G不够用了,这就需要给根目录扩容了,比如扩容到200G。注意!修改磁盘分区有风险,建议先在虚拟机关机状态备份一份虚拟机文件,再来扩容。万一操作不当把原有的文件给格式化了,还能有备份。一、修改VMware Workstation设置...
2018-03-03 17:27:59
2958
原创 linux nfs挂载
前言对于嵌入式linux开发而言,这是一个很基础但是很有用的技巧。开发调试过程,可以把PC机linux编译生成的目标文件放到嵌入式linux系统中运行。一、安装PC机linux中执行以下操作sudo apt-get install nfs-kernel-serversudo /etc/init.d/portmap restart二、配置vi /etc/exports添...
2018-03-03 14:27:25
417
原创 linux临时改变环境变量动态库路径
前言对于嵌入式linux开发而言,这是一个很基础但是很有用的技巧。 嵌入式的linux文件系统一般会设计成只读型,但是在调试过程经常需要修改目标文件或者*.so动态库文件。目标文件运行时默认会从/usr/lib等目录读取so文件,但是这些目录是只读型的,修改不了so文件。解决方法就是把新修改的so文件放在共享目录,比如nfs共享目录,这里写成/tmp/nfsfile。然后改变环境变量,让目标...
2018-03-03 14:15:26
1340
原创 vmware linux虚拟机压缩磁盘
前言为什么要压缩磁盘? 使用linux虚拟机开发过程,逐渐把文件放虚拟机linux中,会发现windows系统下存放linux虚拟机的目录占的磁盘空间越来越大,刚开始可能是10G左右,到后来可能是100G甚至更大。你会发现即使在linux终端中把linux系统中存放的一些不用的大文件删除了,结果还是占那么大的磁盘空间!磁盘占用过大很浪费,而且也不方便备份虚拟机目录。所以就需要压缩虚拟机磁盘了...
2018-03-03 14:04:03
3813
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人