分类 编程.音视频 中的文章

Webrtc二 | 共享桌面

环境

  • Ubuntu18.04
  • webrtc M84

改造peerconnection例子,用来实现桌面共享

改造类CapturerTrackSource

  • 增加桌面的数据源类RcrtcDesktopCapturerTrackSource
  • 继承webrtc::DesktopCapturer::Callback, 用于桌面数据捕获与回调
  • 继承类rtc::VideoSourceInterface<webrtc::VideoFrame>, 用于rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants()); 添加class VideoRenderer : public rtc::VideoSinkInterface<webrtc::VideoFrame> 的回调

详细代码:

……

阅读全文

Webrtc一 | peerconnection

环境

  • Ubuntu18.04
  • webrtc M84

国内镜像:https://webrtc.org.cn/mirror/

webrtc交互过程

通过peerconnection的例子来分析webrtc的交互流程

peer_connection 解析

  1. 为了便于管理,如编码,回显等,需要在应用层和底层一帧数据做一个桥接层,以隔离上下层。
  2. 桥接层的代码主要位于media/basemedia/engine,WebRTC中抽象了VideoSourceInterfaceVideoSinkInterface这两个模板类分别表示生产和吸收视频流。
  3. 如果能提供视频数据,需要实现 VideoSourceInterface,此接口类暴露了 AddOrUpdateSink 函数,可以将 Sink 注册给 Source
  4. 如果想要接收视频数据,需要实现 VideoSinkInterface,此接口类暴露了 OnFrame 函数。只要将 Sink 通过 AddOrUpdateSink 函数注册给 Source, 那么 Source 就会通过 OnFrame 接口将数据传给 Sink
  5. 对于WebRTC的PeerConnection例子,其VcmCapturer类继承了VideoSinkInterfaceTestVideoCapturer类继承类VideoSourceInterface<VideoFrame>

信令交互主要是PeerConnectionClient这个类 初始化socket连接跟 绑定回调

……

阅读全文

FFmpeg | 画中画和视频多宫格处理

FFmpeg生成画中画

静态画中画

将视频sub.mp4视频文件缩放成宽 480 、高 320 的视频,然后显示在 视频 input.mp4,x坐标为0,y 坐标为0 的位置

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay [out]" -vcodec libx264 output.flv

显示在画面的右下角,则需要用到 overlay 中x坐标与y坐标的内部变量:

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay=x=main_w-480:y=main_h-320 [out]" -vcodec libx264 output.flv

根据命令行可以分析出,除了显示在 overlay 画面中,子视频将会定位在主画面的 右边减去子视频的宽度,最下边减去子视频的高度的位置

……

阅读全文

FFmpeg | 给视频加文字和图片水印

ffmpeg从视频中截取图像帧

ffmpeg -i inputfile.avi -r 1 -f image2 image-%05d.jpeg
ffmpeg -i inputfile.avi -r 1 -s 4cif -f image2 image-%05d.jpeg
ffmpeg -i inputfile.avi -r 1 -t 4 -f image2 image-%05d.jpeg
ffmpeg -i inputfile.avi -r 1 -ss 01:30:14 -f image2 image-%05d.jpeg  
ffmpeg -i inputfile.avi -r 1 -ss 01:30:14 -vframes 120 4cif -f image2 image-%05d.jpeg  

-r 指定抽取的帧率,即从视频中每秒钟抽取图片的数量。1代表每秒抽取一帧。
-f 指定保存图片使用的格式,可忽略。
image-%05d.jpeg,指定文件的输出名字。
4cif 代表帧的尺寸为705x576.其他可用尺寸如下。
-t 代表持续时间,单位为秒。
-ss 指定起始时间
-vframes 指定抽取的帧数

……

阅读全文

FFmpeg | 录制摄像头和桌面数据windows

概述

FFmpeg Windows 设备操作 Windows 采集设备的主要方式是 dshow vfwcap gdigrab 其中

  • dshow 可以用来抓 取摄像头、采集卡、麦克风等,- vfwcap 主要用来采集摄像头类设备,- gdigrab 则是抓取 Windows 窗口程序

FFmpeg 使用 dshow 采集音视频设备

使用 dshow 枚举设备

ffmpeg -f dshow -list_devices true -i dymmy

输出

[dshow @ 000002622302e340] DirectShow video devices (some may be both video and audio devices)
[dshow @ 000002622302e340]  "Altair USB2.0 Camera"
[dshow @ 000002622302e340]     Alternative name "@device_pnp_\\?\usb#vid_0ac8&pid_3450&mi_00#6&3b01315a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
[dshow @ 000002622302e340] DirectShow audio devices

``
使用 dshow 展示摄像头, 摄像头的参数为 video=“摄像头名称”

……

阅读全文

FFmpeg | 录制摄像头和桌面数据mac

设备枚举

查看设备列表

$ ffmpeg -hide_banner -devices

Devices:
D. = Demuxing supported
.E = Muxing supported
 --
D avfoundation AVFoundation input device
D lavfi  Libavfilter virtual input device
 E sdl,sdl2 SDL2 output device

可以看到输入设备有:avfoundation,lavfi
输出设备有:sdl
``
设备采集举例:

$  ffmpeg -f avfoundation -list_devices true -i " "

看到了 如下设备

……

阅读全文

Owt-server | owt-client-javascript

概述

天气燥热,不易出门。遂研究一下owt-server,从owt-client-javascript的流程开始吧。

获取一个会议室

owt-client-javascript的时候有一个初始化房间的过程

///owt-client-javascript/src/samples/conference/samplertcservice.js
(function initSampleRoom () {
    
    icsREST.API.getRooms(pageOption, function(rooms){
        ...
        // 获取房间信息,如果有房间,直接跳出,如果没有房间则创建一个房间
        if (sampleRoom !== undefined) {
                break;
        }
    }
    // 创建房间的方法
    var tryCreate = function(room, callback) {...}

    if (!sampleRoom) {
        room = {
        name: 'sampleRoom'
      };
        //创建房间
      tryCreate(room, function(Id) {
        sampleRoom = Id;
        console.log('sampleRoom Id:', sampleRoom);
      });
    }
})

获取token

从owt-client-javascript的rest-sample.js开始发送获取token请求。

……

阅读全文

Licod | 安装和配置

拉取docker镜像并运行

licode官方提供了配置好的docker镜像,使用以下命令拉下来跑就行。

docker run --name licode -p  3000:3000 -p $MIN_PORT-$MAX_PORT:30000-30050/udp -p 3001:3001  -p 8080:8080 -e "MIN_PORT=30000" -e "MAX_PORT=30050" -e "PUBLIC_IP=your_ip_address" lynckia/licode

注意命令里的PUBLIC_IP要改为服务器的公网IP。

配置好之后,在地址栏输入ip:3001回车,chrome就会弹出是否允许摄像头麦克风那个窗口,点击确定,就可以看到你的视频了。

……

阅读全文