rtmp协议作为直播姐的一大利器,周边生态很成熟,比如OBS这些直播工具,可以很好的满足网络推各种流,但是网页播放,传统一般是采用的swf播放插件,现在webrtc越来越流行,浏览器天然支持让音视频应用变得更加简洁高效,而且实时性也得到了不晓得提升。

万能的开源给了我无穷的力量,没有什么是ctrl c v解决不了的,于是稍做整合就出来了一套效果不错的直播推流软件,想给女朋友同步分享看剧的朋友有福了,show me your code

func (h *Handler) OnAudio(timestamp uint32, payload io.Reader) error {// Convert AAC to opusvar audio flvtag.AudioDataif err := flvtag.DecodeAudioData(payload, &audio); err != nil {return err}data := new(bytes.Buffer)if _, err := io.Copy(data, audio.Data); err != nil {return err}if data.Len() <= 0 {log.Println("no audio datas", timestamp, payload)return fmt.Errorf("no audio datas")}// log.Println("\r\ntimestamp->", timestamp, "\r\npayload->", payload, "\r\naudio data->", data.Bytes())datas := data.Bytes()// log.Println("\r\naudio data len:", len(datas), "->") // hex.EncodeToString(datas))if audio.AACPacketType == flvtag.AACPacketTypeSequenceHeader {log.Println("Created new codec ", hex.EncodeToString(datas))err := h.initAudio(h.audioClockRate)if err != nil {log.Println(err, "error initializing Audio")return fmt.Errorf("can't initialize codec with %s", err.Error())}err = h.audioDecoder.InitRaw(datas)if err != nil {log.Println(err, "error initializing stream")return fmt.Errorf("can't initialize codec with %s", hex.EncodeToString(datas))}return nil}pcm, err := h.audioDecoder.Decode(datas)if err != nil {log.Println("decode error: ", hex.EncodeToString(datas), err)return fmt.Errorf("decode error")}// log.Println("\r\npcm len ", len(pcm), " ->") //, pcm)blockSize := 960for h.audioBuffer = append(h.audioBuffer, pcm...); len(h.audioBuffer) >= blockSize*4; h.audioBuffer = h.audioBuffer[blockSize*4:] {pcm16 := make([]int16, blockSize*2)pcm16len := len(pcm16)for i := 0; i < pcm16len; i++ {pcm16[i] = int16(binary.LittleEndian.Uint16(h.audioBuffer[i*2:]))}bufferSize := 1024opusData := make([]byte, bufferSize)n, err := h.audioEncoder.Encode(pcm16, opusData)// n, err := h.audioEncoder.ReadEncode(pcm16, opusData)if err != nil {return err}opusOutput := opusData[:n]// log.Println(" pcm len:", pcm16len, " data->", " opusData len", n, " data->")if audioErr := h.audioTrack.WriteSample(media.Sample{Data:     opusOutput,Duration: 20 * time.Millisecond,}); audioErr != nil {log.Println("WriteSample err", audioErr)}}return nil
}

以上代码,就是简单的实现了AAC转opus的关键一环,将无声的世界变得更美妙的,

取之于开源用之于开源,以下是开源网站地址xiangxud/rtmp-to-webrtc: Demonstrate a RTMP server that publishes to WebRTC (github.com)实现了核心的音视频转接,欢迎大家继续完善,本项目基于技术实践,学习目的,大家严格遵守法律法规,不要将项目用于非法用途。

我也在开发功能更强大得下一版本,增加设备管理,多链路对多peers,强大的订阅发布功能,房间管理,IM等,兴趣是最好的老师,只要有梦想,一定会实现,程序员永远不老!

以下部分功能

obs推流测试

推流至视频会议,多房间多参与者

优化后的效果还不错

RTMP转WEBRTC实现音视频推流及网页无插件播放相关推荐

  1. 网页无插件播放265/264视频/监控大屏/GPU解码

    网页无插件播放265/264视频/监控大屏/GPU解码 先看效果 特点 GPU解码,chrome网页播放32路 h256/hevc 直播视频流,毫无压力. 提供1分屏.4分屏.8分屏.9分屏.16分屏 ...

  2. ffmpeg rtmp音视频推流实现

    ffmpeg rtmp音视频推流实现 紧接上篇文章,实现本地推流,需要经历容器层→解封装→容器层→协议层. 1.准备容器. 容器里有流.编码器等,需要对这些进行规定:为了方便理解,举个不恰当的例子,就 ...

  3. 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(上)

    文章目录 前言 什么是 WebRTC? WebRTC 架构 WebRTC 通讯内容 WebRTC 通讯协议 WebRTC 连接建立过程 后记 前言 最近在做关于考试系统的项目,其中有一项需求分析是要做 ...

  4. 基于WebRTC实现音视频及数据通信

    文章目录 前言 一.WebRTC的组成? 二.信令交换的方式 三.会话描述 四.客户端应用 1.HTML 2.JavaScript 五.效果演示 六.项目地址 总结 前言 刚写了篇基于WebRTC使用 ...

  5. Android音视频开发之音频录制和播放

    Android音视频开发之音频录制和播放 1.封装音频录制工具类: public class RecorderAudioManagerUtils {private static volatile Re ...

  6. 利用RTVS实现html5无插件播放rtsp、rtmp

    引言 最近经常有人咨询RTVS能否播摄像头的rtsp的流,RTVS暂只支持接入JT/T 1078协议,并不支持rtsp等格式. 但可以借助RTVSDev模拟器将rtsp.rtmp.hls或本地文件等视 ...

  7. GB28181监控视频统一汇聚平台LiveGBS将海康大华华为宇视等厂家监控设备统一接入后如何生成固定播放链接或者固定的流地址可以直接无插件播放或者拉取

    目前汇聚各种厂家监控设备的视频汇聚平台,基本都是通过GB28181标准协议实现的.下面介绍下LiveGBS Web无插件直播的GB28181视频平台将各厂家(包括海康.大华.华为.宇视.天地伟业等)监 ...

  8. 如何实现web浏览器无插件播放视频监控直播?

    很多年前,监控视频的直播只能够进行单一的服务器传输,而如今,很多网站已经可以观看视频直播了,不过大多网站观看视频直播的时候还是需要下载插件,有时候就会碰到系统不兼容.版本不对应等问题,那么能不能实现w ...

  9. SkeyeVSS综合安防视频云服务H5无插件直播点播实现HEVC H265 300毫秒以内低延迟播放

    SkeyeVSS综合安防视频云服务H5无插件直播点播实现HEVC/H265 300毫秒以内低延迟播放 SkeyeVSS视频云支持HEVC/H265编码格式的摄像机直接接入,同时不需要后台转码,直接在W ...

最新文章

  1. Firetruck UVA - 208
  2. 【LorMe云讲堂】梁玉婷:农田土壤微生物共存与功能识别调控
  3. pytorch和jittor 程序对比
  4. ubuntu opencv c++ 读取摄像头
  5. 【Android】Activity的task相关
  6. 【HDU - 6231】K-th Number(二分,思维)
  7. php面向对象教学笔记,php学习笔记之面向对象编程
  8. c# 删除文件,清理删除文件
  9. MFC截图工具(不断更新)
  10. pip 离线安装_安装不上python的模块怎么办?别怕,我这有妙招!
  11. 聊聊Elasticsearch RestClient的NodeSelector
  12. 基于群晖DS216+II的家庭存储解决方案
  13. hibernate二级缓存机制
  14. 通达信标记符号_通达信在股票名称后自动标记
  15. IT常用职位缩写总结
  16. (P45)面向对象版表达式计算器:Storage类实现
  17. Java入门学习笔记
  18. 项目规范,介绍,规划与搭建,模块化开发,网站favicon,网站TDK
  19. 分享html代码的博客,简单实用的HTML代码分享
  20. 用设计模式解决电商项目的更新库存业务

热门文章

  1. “智能音箱”技术详解
  2. day04_雷神_函数
  3. java月亮代码_用Java画一个静态的月亮。
  4. 教你如何写PRD文档
  5. 算法设计技巧与分析(八):随机算法(Randomized Algorithms)
  6. 我的世界java版特性_我的世界Java版特性展望直面会爆料
  7. 广东计算机一级考点总结,计算机一级考点归纳总结
  8. 嘉应学院计算机二级考点,2017计算机二级考试MSOffice核考点表格的使用方法
  9. Linux网络安全精要 William Bo Rothwell
  10. 多分类任务中精确率(Precision)、召回率(Recall)以及准确率(Accuracy)评估指标的计算