自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Jacob_job的博客

音视频软件开发

  • 博客(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 4390 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 3559 2

原创 简易的个人博客网站-Hexo安装、部署到github和coding

以前我都是把技术博客发布在CSDN,后来突然有个想法就是自己买个域名并搭建个人博客网站。可以搭在自己的云服务器上,或者可以直接在github或者coding创建项目,把代码部署上去一样可以在上面搭建网站。我的个人博客网站是用hexo生成的,hexo用于搭建个人博客网站很方便,下面简单介绍一下方法。这里随便推广一下我的个人博客网站,可以看看效果 灵动的指针hexo安装apt-get in...

2018-08-20 10:36:55 519

原创 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 1146

原创 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 2031

原创 rtmp信令交互过程分析七-音视频数据(video audio data)

概述在传输完元数据onMetaData之后就开始传输音视频数据了,如视频是H.264编码,第一帧视频帧需要是SPS和PPS,后面才是I帧和P帧。如果是发布端向服务器推流,方向是C->S,如果是播放器向服务器拉流,方向是S->C。音视频数据包的封装后面的文章在详谈,这里只是讲信令交互。举例发布端向服务器推流 C->SVideo DataRTMP ...

2018-08-20 09:52:13 1418

原创 rtmp信令交互过程分析六-元数据(onMetaData)

概述在publish或者play之后就是开始传输媒体数据了,媒体数据分为3种,script脚本数据、video视频数据、audio音频数据。首先需要传输的是脚本数据onMetaData,也称为元数据。onMetaData主要描述音视频的编码格式的相关参数。如果是发布端向服务器推流,则onMetaData的方向是C->S,如果是播放器向服务器拉流,则onMetaData的方向是S-&g...

2018-08-20 09:51:17 2564 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 1708

原创 rtmp信令交互过程分析四-发布(publish)

概述连接成功之后由客户端选择publish还是play,这里讲的是publish。1、C->S : releaseStream、FCPublish、createStreamreleaseStream:释放stream,这一步的作用是通知服务端释放对应的stream,以便接下来重新创建stream。FCPublishcreateStream2、S->C : _re...

2018-08-20 09:49:25 2630

原创 rtmp信令交互过程分析三-连接(connect)

概述握手之后就是连接(connect),由客户端发起,服务端响应,connect指定的app。1、C->S : connectapp:需要connect的app名称flashVertcUrlfpadcapabilitiesaudioCodecsvideoCodecsvideoFunction2、S->C : Window Acknowledgement...

2018-08-20 09:48:27 1789

原创 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 1102

原创 rtmp信令交互过程分析一-概述

后续会写一系列关于rtmp的文章,这是第一篇信令交互的概述。使用wireshark抓包分析rtmp推流和拉流过程的信令,大致如下:通用部分箭头>>>表示C->S,箭头<<<表示S->C>>> Handshake C0+C1<&a

2018-08-20 09:46:11 1167

原创 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 1682

原创 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 2852

原创 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 4461 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 1208

原创 Makefile C与C++混编的简单写法

用了很久的Linux,感觉还是对Makefile不够熟悉,经常为一个复杂一点的项目的Makefile折腾半天。现在对Makefile的基本写法做一下总结,方便以后查阅。这里用我近期写的一个Makefile做讲解,是一个C与C++混编的项目。并附上完整的Makefile内容。目录结构是:+--include/+--include/librtmp+--liblog/+--libr...

2018-05-03 16:59:37 2656

原创 使用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 1249 1

原创 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 2053

原创 web无插件解码播放H264/H265(WebAssembly解码HTML5播放)

我之前写过一篇《web无插件解码播放H264/H265(js解码HTML5播放)》,与本文的项目意义基本一致,不同的是实现方案有一定差异。之前介绍的是纯JS解码,本文介绍WebAssembly解码。本项目已经用于实际产品之中,亲测可用。项目描述:视频传输使用websocket协议,ipc后端推流使用C语言编程,web前端收流使用js语言。视频解码库使用WebAssembly实现...

2018-03-04 14:42:55 47799 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 35981 23

原创 使用emscripten编译WebAssembly

需要编译的c语言demo程序add.c#include <stdio.h>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 3690

原创 WebAssembly wabt工具安装和使用

emscripten编译生成的WebAssembly文件是*.wasm的二进制文件,不方便阅读。使用wabt工具,可以实现wasm与wast的互转,有助于理解wasm内部接口。wasm是二进制文件,可读性很差。wast是文本文件,可以看到wasm的内部接口。下载https://github.com/WebAssembly/wabt安装略。根据readme安装。...

2018-03-03 23:49:20 5815 3

原创 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 2869

原创 WebAssembly简介

什么是WebAssembly虽然WebAssembly从名字翻译来说是web版的汇编语言,但是其实是一个二进制文件。 与asm.js相比之下,asm.js更像是web版的汇编语言,WebAssembly是web版的二进制语言,效率更高。 二者的编译工具链都是从emscripten编译而来,但是编译方法有所区别。具体在环境搭建中介绍。哪些浏览器支持WebAssemblyWebAsse...

2018-03-03 23:26:38 1395

原创 ejs模板基础用法

前言ejs是适合在node.js中生成动态页面的模板,可以根据后端数据库中的数据按照一定逻辑处理渲染页面。其实静态html页面配合js,js通过http获取后端数据后也能动态渲染页面。但是这样是有缺点的。静态页面+js 的缺点:不安全。把后端数据库的内容通过http发到前端进行解析再渲染页面,http接口容易被盗用,后端数据库数据被盗。不流畅。整个页面的渲染分2步,先加载页面文...

2018-03-03 21:38:42 1185

原创 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 4526

原创 forever实现node.js应用在后台运行

前段时间使用node.js开发公司网站,是运行在linux系统的,一开始习惯性的认为只要在运行node.js应用的命令后面加&就可以实现后台运行,如 node app.js &,但是结果关闭终端时进程就被退出了。最终发现了forever可以实现node.js的后台运行维护,而且万一程序出错进程退出时还可以重新被拉起来。一、安装npm install -g forever...

2018-03-03 21:17:15 546

原创 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 244

原创 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 654

原创 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 409

原创 rtmp信令格式

rtmp以TCP方式推流,分为一个个消息包。一、握手 握手开始于客户端发送 C0,C1 块。 服务端在发送 S0 和 S1 之前必须等待接收 C0,也可以等待接收 C1。 服务端在发送 S2 之前必须等待接收 C1。 在发送 C2 之前客户端必须等待接收 S1 。 客户端在发送任何数据之前必须等待接收 S2。 服务端在发送任何数据之前必须等待接收 C2。1、 ...

2018-03-03 20:31:47 1198

原创 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 1827

原创 rtp基本封包格式

rtp包易于过大,一般每个包不要超过1400,这里设置为1380,即DEFAULT_MTU=1380这里介绍的媒体格式有视频:H264/H265,音频:AAC1、如果媒体包小于DEFAULT_MTU时可直接写入rtp包中,示例代码: unsigned char *pNAL; //媒体数据包 int nalsize; //媒体数据包长度 ...

2018-03-03 20:26:15 4368

原创 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 1781

原创 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 3301 1

原创 虚拟机ubuntu server 14.04 64bit 根目录扩容

前言为什么需要扩容?使用VMware Workstation安装linux虚拟机时需要设置虚拟的硬盘空间多大,比如一开始设置为50G,在开发过程渐渐的觉得50G不够用了,这就需要给根目录扩容了,比如扩容到200G。注意!修改磁盘分区有风险,建议先在虚拟机关机状态备份一份虚拟机文件,再来扩容。万一操作不当把原有的文件给格式化了,还能有备份。一、修改VMware Workstation设置...

2018-03-03 17:27:59 2797

原创 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 308

原创 linux临时改变环境变量动态库路径

前言对于嵌入式linux开发而言,这是一个很基础但是很有用的技巧。 嵌入式的linux文件系统一般会设计成只读型,但是在调试过程经常需要修改目标文件或者*.so动态库文件。目标文件运行时默认会从/usr/lib等目录读取so文件,但是这些目录是只读型的,修改不了so文件。解决方法就是把新修改的so文件放在共享目录,比如nfs共享目录,这里写成/tmp/nfsfile。然后改变环境变量,让目标...

2018-03-03 14:15:26 1179

原创 vmware linux虚拟机压缩磁盘

前言为什么要压缩磁盘? 使用linux虚拟机开发过程,逐渐把文件放虚拟机linux中,会发现windows系统下存放linux虚拟机的目录占的磁盘空间越来越大,刚开始可能是10G左右,到后来可能是100G甚至更大。你会发现即使在linux终端中把linux系统中存放的一些不用的大文件删除了,结果还是占那么大的磁盘空间!磁盘占用过大很浪费,而且也不方便备份虚拟机目录。所以就需要压缩虚拟机磁盘了...

2018-03-03 14:04:03 3643

空空如也

空空如也

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

TA关注的人

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