Use VAAPI but its quality is horrible

This commit is contained in:
John Nguyen 2023-05-08 19:58:06 +10:00
parent dead16ac07
commit a5830dc440
4 changed files with 22 additions and 8 deletions

View file

@ -36,7 +36,7 @@ RUN ./build
FROM ghcr.io/m1k1o/neko/intel-firefox:latest FROM ghcr.io/m1k1o/neko/intel-firefox:latest
RUN set -eux; apt-get update; \ RUN set -eux; apt-get update; \
apt-get install -y --no-install-recommends i965-va-driver; \ apt-get install -y --no-install-recommends intel-media-va-driver-non-free i965-va-driver-shaders; \
# #
# clean up # clean up
apt-get clean -y; \ apt-get clean -y; \

View file

@ -30,7 +30,7 @@ import (
*/ */
const ( const (
videoSrc = "ximagesrc display-name=%s show-pointer=true use-damage=false ! video/x-raw,framerate=%d/1 ! videoconvert ! queue ! " videoSrc = "ximagesrc display-name=%s show-pointer=true use-damage=false ! video/x-raw,framerate=%d/1 ! vaapipostproc ! queue ! "
audioSrc = "pulsesrc device=%s ! audio/x-raw,channels=2 ! audioconvert ! " audioSrc = "pulsesrc device=%s ! audio/x-raw,channels=2 ! audioconvert ! "
) )
@ -47,7 +47,7 @@ func NewBroadcastPipeline(device string, display string, pipelineSrc string, url
// replace display // replace display
pipelineStr = strings.Replace(pipelineStr, "{display}", display, -1) pipelineStr = strings.Replace(pipelineStr, "{display}", display, -1)
} else { } else {
pipelineStr = fmt.Sprintf("flvmux name=mux ! rtmpsink location='%s live=1' %s audio/x-raw,channels=2 ! audioconvert ! voaacenc ! mux. %s video/x-raw,format=NV12 ! x264enc bitrate=%d bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! mux.", url, audio, video, 8000) pipelineStr = fmt.Sprintf("flvmux name=mux ! rtmpsink location='%s live=1' %s audio/x-raw,channels=2 ! audioconvert ! voaacenc ! mux. %s video/x-raw,format=NV12 ! vaapih264enc rate-control=cbr bitrate=%d keyframe-period=180 quality-level=7 ! h264parse ! mux.", url, audio, video, 8000)
} }
return pipelineStr, nil return pipelineStr, nil
@ -149,7 +149,7 @@ func NewVideoPipeline(rtpCodec codec.RTPCodec, display string, pipelineSrc strin
return "", err return "", err
} }
pipelineStr = fmt.Sprintf(videoSrc+"video/x-raw,format=NV12 ! vaapih264enc rate-control=vbr bitrate=%d keyframe-period=180 quality-level=7 ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline"+pipelineStr, display, fps, bitrate) pipelineStr = fmt.Sprintf(videoSrc+"video/x-raw,format=NV12 ! vaapih264enc rate-control=vbr bitrate=%d keyframe-period=180 quality-level=7 ! h264parse ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline"+pipelineStr, display, fps, bitrate)
} else if hwenc == config.HwEncNVENC { } else if hwenc == config.HwEncNVENC {
if err := gst.CheckPlugins([]string{"nvcodec"}); err != nil { if err := gst.CheckPlugins([]string{"nvcodec"}); err != nil {
return "", err return "", err

View file

@ -54,6 +54,10 @@ func (c *Client) readPump() {
c.conn.SetReadDeadline(time.Now().Add(pongWait)) c.conn.SetReadDeadline(time.Now().Add(pongWait))
return nil return nil
}) })
defer func() {
c.hub.unregister <- c
c.conn.Close()
}()
for { for {
_, raw, err := c.conn.ReadMessage() _, raw, err := c.conn.ReadMessage()
@ -61,7 +65,7 @@ func (c *Client) readPump() {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
log.Printf("error: %v", err) log.Printf("error: %v", err)
} }
return break
} }
c.hub.broadcast <- raw c.hub.broadcast <- raw
} }
@ -71,16 +75,19 @@ func (c *Client) writePump() {
ticker := time.NewTicker(pingPeriod) ticker := time.NewTicker(pingPeriod)
defer func() { defer func() {
ticker.Stop() ticker.Stop()
c.hub.unregister <- c
close(c.send)
c.conn.Close() c.conn.Close()
}() }()
for { for {
select { select {
case raw := <-c.send: case raw, ok := <-c.send:
c.conn.SetWriteDeadline(time.Now().Add(writeWait)) c.conn.SetWriteDeadline(time.Now().Add(writeWait))
if !ok {
c.conn.WriteMessage(websocket.CloseMessage, []byte{})
return
}
if err := c.conn.WriteMessage(websocket.BinaryMessage, raw); err != nil { if err := c.conn.WriteMessage(websocket.BinaryMessage, raw); err != nil {
log.Printf("Error writing message: %v", err) log.Printf("Error writing message: %v", err)
return return

View file

@ -22,6 +22,10 @@ func NewHub() *Hub {
} }
} }
func (h *Hub) PrintConns() {
log.Printf("Current connections, clients: %d, hosts: %d", len(h.clients), len(h.hosts))
}
func (h *Hub) Run() { func (h *Hub) Run() {
for { for {
select { select {
@ -41,6 +45,7 @@ func (h *Hub) Run() {
h.hosts[client] = true h.hosts[client] = true
} }
log.Printf("New connection: %s", client.connectionType) log.Printf("New connection: %s", client.connectionType)
h.PrintConns()
case client := <-h.unregister: case client := <-h.unregister:
log.Printf("Disconnecting %s", client.connectionType) log.Printf("Disconnecting %s", client.connectionType)
@ -57,7 +62,9 @@ func (h *Hub) Run() {
if _, ok := pool[client]; ok { if _, ok := pool[client]; ok {
delete(pool, client) delete(pool, client)
close(client.send)
} }
h.PrintConns()
case raw := <-h.broadcast: case raw := <-h.broadcast:
for client := range h.hosts { for client := range h.hosts {
client.send <- raw client.send <- raw