h264 encoding profile constrained-baseline, #109.
This commit is contained in:
parent
887413d536
commit
3c17dbe282
@ -79,7 +79,7 @@ nat1to1: <ip>
|
|||||||
- `gstreamer1.0-plugins-good`
|
- `gstreamer1.0-plugins-good`
|
||||||
- `gstreamer1.0-plugins-bad`
|
- `gstreamer1.0-plugins-bad`
|
||||||
- `gstreamer1.0-plugins-ugly`
|
- `gstreamer1.0-plugins-ugly`
|
||||||
- e.g. `ximagesrc display-name=%s show-pointer=true use-damage=false ! video/x-raw,framerate=30/1 ! videoconvert ! queue ! video/x-raw,format=NV12 ! x264enc threads=4 bitrate=3500 key-int-max=60 vbv-buf-capacity=4000 byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream`
|
- e.g. `ximagesrc display-name=%s show-pointer=true use-damage=false ! video/x-raw,framerate=30/1 ! videoconvert ! queue ! video/x-raw,format=NV12 ! x264enc threads=4 bitrate=3500 key-int-max=60 vbv-buf-capacity=4000 byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline`
|
||||||
#### `NEKO_MAX_FPS`:
|
#### `NEKO_MAX_FPS`:
|
||||||
- The resulting stream frames per seconds should be capped *(0 for uncapped)*.
|
- The resulting stream frames per seconds should be capped *(0 for uncapped)*.
|
||||||
- e.g. `0`
|
- e.g. `0`
|
||||||
|
@ -95,9 +95,9 @@ services:
|
|||||||
! videoconvert
|
! videoconvert
|
||||||
! queue
|
! queue
|
||||||
! video/x-raw,framerate=30/1,format=NV12
|
! video/x-raw,framerate=30/1,format=NV12
|
||||||
! v4l2h264enc extra-controls="controls,h264_profile=0,video_bitrate=1250000;"
|
! v4l2h264enc extra-controls="controls,h264_profile=1,video_bitrate=1250000;"
|
||||||
! h264parse config-interval=3
|
! h264parse config-interval=3
|
||||||
! video/x-h264,profile=baseline,stream-format=byte-stream
|
! video/x-h264,stream-format=byte-stream,profile=constrained-baseline
|
||||||
NEKO_VIDEO_CODEC: h264
|
NEKO_VIDEO_CODEC: h264
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -143,20 +143,20 @@ 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"+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 ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline"+pipelineStr, display, fps, bitrate)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// https://gstreamer.freedesktop.org/documentation/openh264/openh264enc.html?gi-language=c#openh264enc
|
// https://gstreamer.freedesktop.org/documentation/openh264/openh264enc.html?gi-language=c#openh264enc
|
||||||
// gstreamer1.0-plugins-bad
|
// gstreamer1.0-plugins-bad
|
||||||
// openh264enc multi-thread=4 complexity=high bitrate=3072000 max-bitrate=4096000
|
// openh264enc multi-thread=4 complexity=high bitrate=3072000 max-bitrate=4096000
|
||||||
if err := gst.CheckPlugins([]string{"openh264"}); err == nil {
|
if err := gst.CheckPlugins([]string{"openh264"}); err == nil {
|
||||||
pipelineStr = fmt.Sprintf(videoSrc+"openh264enc multi-thread=4 complexity=high bitrate=%d max-bitrate=%d ! video/x-h264,stream-format=byte-stream"+pipelineStr, display, fps, bitrate*1000, (bitrate+1024)*1000)
|
pipelineStr = fmt.Sprintf(videoSrc+"openh264enc multi-thread=4 complexity=high bitrate=%d max-bitrate=%d ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline"+pipelineStr, display, fps, bitrate*1000, (bitrate+1024)*1000)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c
|
// https://gstreamer.freedesktop.org/documentation/x264/index.html?gi-language=c
|
||||||
// gstreamer1.0-plugins-ugly
|
// gstreamer1.0-plugins-ugly
|
||||||
// video/x-raw,format=I420 ! x264enc bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream
|
// video/x-raw,format=I420 ! x264enc bframes=0 key-int-max=60 byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline
|
||||||
if err := gst.CheckPlugins([]string{"x264"}); err != nil {
|
if err := gst.CheckPlugins([]string{"x264"}); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@ -166,7 +166,7 @@ func NewVideoPipeline(rtpCodec codec.RTPCodec, display string, pipelineSrc strin
|
|||||||
vbvbuf = bitrate
|
vbvbuf = bitrate
|
||||||
}
|
}
|
||||||
|
|
||||||
pipelineStr = fmt.Sprintf(videoSrc+"video/x-raw,format=NV12 ! x264enc threads=4 bitrate=%d key-int-max=60 vbv-buf-capacity=%d byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream"+pipelineStr, display, fps, bitrate, vbvbuf)
|
pipelineStr = fmt.Sprintf(videoSrc+"video/x-raw,format=NV12 ! x264enc threads=4 bitrate=%d key-int-max=60 vbv-buf-capacity=%d byte-stream=true tune=zerolatency speed-preset=veryfast ! video/x-h264,stream-format=byte-stream,profile=constrained-baseline"+pipelineStr, display, fps, bitrate, vbvbuf)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("unknown codec %s", rtpCodec.Name)
|
return "", fmt.Errorf("unknown codec %s", rtpCodec.Name)
|
||||||
|
Reference in New Issue
Block a user