docker编译环境
docker pull abdulachik/ffmpeg.js:latest
docker run -it -p 8080:8080 -v /Users/workspace/Downloads/ffmpeg_wasm:/tmp --privileged=true abdulachik/ffmpeg.js:latest /bin/bash
cd /tmp
流程概述
摄像头->ffmpeg->编码为h264视频->传递给h264解码器->播放
(也可以让视频编码后直接RTMP协议推流,本地解码播放仅作测试)
ffmpeg编码视频流(来自摄像头)为flv(h264)
读取PC摄像头视频数据并以RTMP协议发送为直播流。
ffmpeg综合应用示例(一)——摄像头直播
浏览器可通过调用MediaDevices.getUserMedia()来访问本地媒体,调用该方法后浏览器会提示用户给予使用媒体输入的许可,媒体输入会产生一个MediaStream,里面包含了请求的媒体类型的轨道。此流可以包含一个视频轨道(来自硬件或者虚拟视频源,比如相机、视频采集设备和屏幕共享服务等等)、一个音频轨道(同样来自硬件或虚拟音频源,比如麦克风、A/D转换器等等),也可能是其它轨道类型。
谈谈MediaStream
FFmpeg获取DirectShow设备数据(摄像头,录屏)
流媒体协议
- RTP:基于UDP协议,不保证传输质量
- RTCP
- RTSP
- RTMP
- MMS
- HLS
编码为H.264,发布RTP
下面这条命令,实现了:获取摄像头数据->编码为H.264->封装为RTP并发送至组播地址。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://233.233.233.223:6666>test.sdp
注1:考虑到提高libx264的编码速度,添加了-preset:v ultrafast和-tune:v zerolatency两个选项。
注2:结尾添加“>test.sdp”可以在发布的同时生成sdp文件。该文件可以用于该视频流的播放。
下面这条命令,实现了从摄像头读取数据并编码为H.264,最后保存成mycamera.mkv。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec libx264 mycamera.mkv
编码为MPEG2,发布UDP
与编码为H.264类似,指明-vcodec即可。
ffmpeg -f dshow -i video="Integrated Camera" -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666
浏览器上实现编码为H.264并发布RTP
假设获取到的浏览器视频流为MediaStream
写成命令形式为:
ffmpeg -f dshow -i video="MediaStream" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -s 320x240 -f rtp rtp://192.168.4.1 > cam_h264.sdp