基于flash的web视频对讲直播测试

时间:2023-03-09 16:35:13
基于flash的web视频对讲直播测试

由于项目的需求,要在web上实现视频通话的需求。
现成的方案有WebRTC,基于浏览器的成熟方案,但是这个方案和公司项目需求有几个点冲突。
后来考虑到基于flash的方案。
参考雷神的博客 simplest_as3_rtmp_streamer
http://blog.****.net/leixiaohua1020/article/details/43936141

本机软件环境Win7_64位下,IE11,Flash Builder 4.7, ffplay播放
摄像头采用罗技C930e,麦克风用摄像头自带的。
服务器采用SRSv2.0_r2

编码采用ActionScript3脚本语言,flash.media.Video采集视频,flash.media.Microphone采集音频,
flash.net.NetConnection连接srs服务器,flash.net.NetStream推流。

测试在局域网内视频通话。
视频采集分辨率为1280*720 30fps 200Kbps H264编码。
音频采用44100采样率 单声道 40kbps nellymoser编码。
局域网内测试延迟如下:

基于flash的web视频对讲直播测试 基于flash的web视频对讲直播测试

代码改写自雷神博客,服务器采用srs,特此感谢雷神,感谢Winlin。

 package {
import flash.display.MovieClip;
import flash.events.NetStatusEvent;
import flash.media.Camera;
import flash.media.H264Level;
import flash.media.H264Profile;
import flash.media.H264VideoStreamSettings;
import flash.media.Microphone;
import flash.media.SoundCodec;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream; public class media extends MovieClip
{
private var nc:NetConnection;
private var ns:NetStream;
private var nsPlayer:NetStream;
private var vid:Video;
private var vidPlayer:Video;
private var cam:Camera;
private var mic:Microphone; private var screen_w:int=384;
private var screen_h:int=216; public function media()
{
nc = new NetConnection();
nc.client = {};
nc.client.onBWDone = function():void {};
nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
nc.connect("rtmp://192.168.100.168/testas3/");
trace("NetConnection !!!");
} private function onNetStatus(event:NetStatusEvent):void{
trace(event.info.code);
if(event.info.code == "NetConnection.Connect.Success"){
publishCamera();
displayPublishingVideo();
}
} private function publishCamera(): void{ //Cam
cam = Camera.getCamera();
cam.setMode(1280, 720, 30);
cam.setKeyFrameInterval(30);
cam.setQuality(200000, 90); var x264profile:String = H264Profile.MAIN; // H264Profile.BASELINE;
var x264level:String = H264Level.LEVEL_4_1;
var h264setting:H264VideoStreamSettings = new H264VideoStreamSettings();
h264setting.setProfileLevel(x264profile, x264level); //Mic
mic = Microphone.getMicrophone();
mic.codec = SoundCodec.NELLYMOSER;//SoundCodec.SPEEX
mic.setLoopBack(false);
mic.gain=55;
mic.setUseEchoSuppression(true);
mic.rate = 44; ns = new NetStream(nc);
ns.client = {};
ns.addEventListener(NetStatusEvent.NET_STATUS, function(evt:NetStatusEvent):void {
trace ("NetStream: code=" + evt.info.code);
// TODO: FIXME: failed event.
}); //H.264 Setting
ns.videoStreamSettings = h264setting;
ns.attachCamera(cam);
ns.attachAudio(mic);
ns.publish("1111", "live");
} private function displayPublishingVideo():void {
vid = new Video(screen_w, screen_h);
vid.x = 20;
vid.y = 20;
vid.attachCamera(cam);
addChild(vid);
}
}
}