Piasy

NEVER STOP

再探 H.264:句法元素详解

两年多前,我发布了我需要知道:H.264 一文,限于篇幅,当时没有对具体的句法元素做任何总结。 原本我想把每一层的各个句法元素简略过一遍的(实际也这么做过),但奈何完全无法涵盖细节,而众多句法元素罗列一遍实在无法脱离堆砌之嫌,所以索性删了个干净。感兴趣的朋友强烈建议阅读原书,或者 H.264 SPEC,至于从事视频编解码相关工作的朋友,则一定要对句法和语义烂熟于胸了。 这次,为了...

OWT Server 快速入门

去年做了一个多平台的(Android/iOS/Windows)基于 WebRTC 的多人音视频通话的项目,客户端基于 WebRTC 最新的客户端代码封装业务逻辑,自己写信令对接 SFU,SFU 最初是对接的 Janus Gateway(所以我才会去给 Janus 提 PR),但 Janus 在中弱网下(ping 4% 丢包 100ms RTT)的表现非常差,一直处于卡死状态。 几经波折,前...

WebRTC Native 源码导读(十五):RTP H.264 封包与解包

之前我在为 janus-pp-rec 增加视频旋正功能一文中简单介绍了一点 RTP 协议的内容,重点关注的是视频方向的 RTP header extension,这次我们更深入的了解一下 RTP 协议的内容,看看 H.264 视频数据是如何封装和解封装的。 其他视频编码格式的封装和解封装大体思路应该是一样的,大家可以举一反三;音频数据的封装和解封装,日后可能我会再整理一篇文章。 注:本文...

WebRTC Native 源码导读(十四):API 概览

第一次看到 WebRTC 这个词是 15 年在一期 Android Weekly 中,但当时完全看不懂它在讲什么,也就没有深究。两年后,我开始搞起 WebRTC,并整理出了一套开箱即用的 WebRTC 开发环境,距今又过了一年多。 按常理,这篇文章要介绍的内容本应最先呈现,但我搞 WebRTC 的路线略微反常,由于没有实际使用的需求,所以我先是研究了不少模块的实现原理。但随着接触到更多内容...

为 janus-pp-rec 增加视频旋正功能

Janus Gateway 支持 server 端录制,保存的文件格式是对 RTP 报文的一种自定义封装格式(MJR),音视频数据单独存储,官方提供了一个 janus-pp-rec 的程序,可以把 MJR 格式的文件转换为其他封装格式的文件,然后我们可以利用 ffmpeg 把音视频文件合并为一个文件,命令如下(以 H.264 和 OPUS 编码为例): janus-pp-rec video...

WebRTC Native 源码导读(十三):音频设备模块 ADM

我真正接触 WebRTC 的 ADM 是在做 iOS 混音的时候,iOS 的音频采集、播放之前没有做过,所以想着从 WebRTC 的音频采集播放代码里借鉴一下 AudioUnit 的使用,结果折腾了半天愣是没搞定,后来索性直接使用了 ADM,为混音项目草草地画上了句号。 今天,就让我们仔细看看 WebRTC 的 ADM。 功能介绍 ADM 被 WebRtcVoiceEngine 所使用...

macOS 下单步调试 WebRTC Android & iOS

上一篇文章里有位读者朋友咨询我,如何调试 WebRTC iOS demo。显然这个小问题不值一篇文章,所以这周我就花了大量的精力,解决了长久以来困扰广大 WebRTC 安卓开发者的难题:如何在 Android Studio 里单步调试 WebRTC Android 的 native 代码。 今天我就在这里给大家带来一场盛宴 :) WebRTC 代码下载 首先给各位上点冰镇白开,解解暑:...

WebRTC Native 源码导读(十二):P2P 连接过程完全解析

一年前我初步分析了 WebRTC 的 P2P 连接过程,并总结为了安卓 P2P 连接过程和 DataChannel 使用一文,那会儿我刚接触 WebRTC C++ 的代码,看起来着实头大,而且安卓的代码要调试、测试也很麻烦,所以很多细节就没有展开,今天就让我们在 iOS 的工程里,对 P2P 连接的过程进行一个彻底的剖析。 概览 首先我们从宏观上了解一下 P2P 连接的过程,以及一些关键...

WebSocket Go

最近工作需要,对 WebSocket 进行了一点研究,今天在这里给大家分享一下我对 WebSocket 协议、WebSocket 的 Go 语言实现,以及 socket.io 服务端库的 Go 语言实现的理解。 WebSocket 简介 WebSocket 旨在实现 Web 应用(例如 IM、游戏等)里和 Server 的双向通信(两端称为 peer),以替代 HTTP 轮询等方案。 ...

WebRTC Native 源码导读(十一):混音

去年十一月份我就打上了 WebRTC 混音模块的主意,并且做了一些尝试,不过最终没有做完,半年多过去了,正好最近工作上对此有了需求,所以这次就趁热打铁,把它彻底吃掉 :) 本文的分析基于 WebRTC 的 #23295 提交。 AudioMixer 的使用 AudioMixer 的使用比较简单,只需要三步: 创建:const auto mixer = AudioMixerImp...