sdp交换存在问题

This commit is contained in:
TonyChyi
2022-09-30 12:24:32 +08:00
parent 5c93e698b6
commit acf74153ef
4 changed files with 69 additions and 49 deletions

View File

@@ -2,32 +2,35 @@ package qemuserver
import (
"fmt"
"io"
"net/url"
"os"
"time"
"git.sense-t.eu.org/ACE/ace/drivers/audio"
"git.sense-t.eu.org/ACE/ace/drivers/video"
"git.sense-t.eu.org/ACE/ace/lib/audiodriver"
"git.sense-t.eu.org/ACE/ace/lib/qemuconnection"
"github.com/digitalocean/go-qemu/qemu"
"github.com/digitalocean/go-qemu/qmp"
"github.com/pion/mediadevices/pkg/driver"
"github.com/pion/mediadevices/pkg/driver/vncdriver"
"github.com/sirupsen/logrus"
)
const waveHeaderSize = audiodriver.FmtHeaderSizeDefault
const waveHeaderSize = audio.FmtHeaderSizeDefault
var waveHeader *audiodriver.WavHeader
var waveHeader *audio.WavHeader
func init() {
waveHeader = audiodriver.DefaultHeader()
waveHeader = audio.DefaultHeader()
}
type Server struct {
options *Options
qemu *qemu.Domain
audioHeader chan *audiodriver.WavHeader
pcm chan [audiodriver.BufferSize]byte
audioHeader chan *audio.WavHeader
pcm chan []byte
ppm chan io.ReadCloser
}
var DefaultServer *Server
@@ -39,8 +42,9 @@ func NewServer(o *Options) (*Server, error) {
server := &Server{
options: o,
audioHeader: make(chan *audiodriver.WavHeader, 1),
pcm: make(chan [audiodriver.BufferSize]byte),
audioHeader: make(chan *audio.WavHeader, 1),
pcm: make(chan []byte),
ppm: make(chan io.ReadCloser),
}
u, err := url.Parse(o.QmpAddress)
@@ -70,7 +74,11 @@ func NewServer(o *Options) (*Server, error) {
}
server.qemu = qemu
audio := audiodriver.New()
audio := &audio.PCMStreamDriver{
PCM: server.pcm,
WaveHeader: waveHeader,
BufferSizeByBytes: 2048, // to be configured
}
if err := driver.GetManager().Register(
audio,
driver.Info{
@@ -81,11 +89,15 @@ func NewServer(o *Options) (*Server, error) {
); err != nil {
return nil, err
}
audio.PCM = server.pcm
audio.WaveHeader = waveHeader
video := &video.PPMStreamDriver{
Height: 768,
Width: 1024,
FPS: 60,
PPMImage: server.ppm,
}
if err := driver.GetManager().Register(
vncdriver.NewVnc(o.VNCAddress),
video,
driver.Info{
Label: "vnc",
DeviceType: driver.Camera,
@@ -101,12 +113,35 @@ func NewServer(o *Options) (*Server, error) {
func (s *Server) Run() error {
logrus.Debug("qemu server running")
f, err := os.Open(s.options.AudioPipe)
if err != nil {
logrus.Fatal(err)
}
defer f.Close()
logrus.Debug("start reading fifo")
go func() {
f, err := os.Open(s.options.AudioPipe)
if err != nil {
logrus.Fatal(err)
}
defer f.Close()
logrus.Debug("start reading fifo")
logrus.Debug("skip wave headers, to the PCM!")
// skip to pcm data, for 44 bytes.
var _dataChunkHeader [audiodriver.FmtHeaderOffset +
audiodriver.FmtHeaderIDSize + audiodriver.FmtHeaderChunkSizeSize + waveHeaderSize +
audiodriver.DataChunkIDSize + audiodriver.DataChunkSizeSize]byte
if _, err := f.Read(_dataChunkHeader[:]); err != nil {
logrus.Fatal(err)
}
defer close(s.pcm)
for {
b := make([]byte, 2048) // to be configured
if _, err := f.Read(b[:]); err != nil {
logrus.Error(err)
}
select {
case s.pcm <- b:
case <-time.After(waveHeader.GetLatnecy(2048)):
}
}
}()
go func() {
logrus.Debug("setting audio capture")
@@ -128,26 +163,20 @@ func (s *Server) Run() error {
logrus.Debug("audio capture set")
}()
logrus.Debug("skip wave headers, to the PCM!")
// skip to pcm data, for 44 bytes.
var _dataChunkHeader [audiodriver.FmtHeaderOffset +
audiodriver.FmtHeaderIDSize + audiodriver.FmtHeaderChunkSizeSize + waveHeaderSize +
audiodriver.DataChunkIDSize + audiodriver.DataChunkSizeSize]byte
if _, err := f.Read(_dataChunkHeader[:]); err != nil {
logrus.Fatal(err)
}
go func() {
logrus.Debug("screen capture start")
defer close(s.ppm)
for range time.Tick(time.Second / 60) { // to be configured
ppm, err := s.qemu.ScreenDump()
if err != nil {
logrus.Error(err)
continue
}
s.ppm <- ppm
}
}()
defer close(s.pcm)
for {
var b [audiodriver.BufferSize]byte
if _, err := f.Read(b[:]); err != nil {
logrus.Error(err)
}
select {
case s.pcm <- b:
case <-time.After(waveHeader.GetLatnecy()):
}
}
select {}
}
func (s *Server) SendEvent(b []byte) error {