webrtc 硬编码

参考代码:

LiveTalking/app.py at 16774890b8d76ece2a2293c9b71cd8265986f329 · lex2029/LiveTalking

python 复制代码
def _enable_h264_nvenc() -> bool:
    try:
        import fractions
        import av
        import aiortc.codecs as codecs
        import aiortc.codecs.h264 as h264
    except Exception as exc:
        logger.info("NVENC init skipped: %s", exc)
        return False

    try:
        av.CodecContext.create("h264_nvenc", "w")
    except av.AVError as exc:
        logger.info("NVENC not available: %s", exc)
        return False

    class H264EncoderNVENC(h264.H264Encoder):
        def _encode_frame(self, frame, force_keyframe: bool):
            if self.codec and (
                frame.width != self.codec.width
                or frame.height != self.codec.height
                or abs(self.target_bitrate - self.codec.bit_rate) / self.codec.bit_rate
                > 0.1
            ):
                self.buffer_data = b""
                self.buffer_pts = None
                self.codec = None

            if force_keyframe:
                frame.pict_type = av.video.frame.PictureType.I
            else:
                frame.pict_type = av.video.frame.PictureType.NONE

            if self.codec is None:
                try:
                    codec = av.CodecContext.create("h264_nvenc", "w")
                except av.AVError:
                    codec = av.CodecContext.create("libx264", "w")

                codec.width = frame.width
                codec.height = frame.height
                codec.bit_rate = self.target_bitrate
                codec.pix_fmt = "yuv420p"
                codec.framerate = fractions.Fraction(h264.MAX_FRAME_RATE, 1)
                codec.time_base = fractions.Fraction(1, h264.MAX_FRAME_RATE)

                if codec.name == "h264_nvenc":
                    try:
                        codec.options = {
                            "preset": "p3",
                            "rc": "cbr",
                            "bf": "0",
                            "g": "60",
                            "tune": "ll",
                        }
                    except Exception:
                        codec.options = {}
                    try:
                        codec.profile = "baseline"
                    except Exception:
                        pass
                else:
                    codec.options = {
                        "level": "31",
                        "tune": "zerolatency",
                    }
                    codec.profile = "Baseline"

                self.codec = codec

            data_to_send = b""
            for package in self.codec.encode(frame):
                data_to_send += bytes(package)

            if data_to_send:
                yield from self._split_bitstream(data_to_send)

    h264.H264Encoder = H264EncoderNVENC
    codecs.H264Encoder = H264EncoderNVENC
    logger.info("Using NVENC H264 encoder")
    return True


_H264_NVENC_ENABLED = _enable_h264_nvenc()
相关推荐
Mahut1 天前
我用 Electron + FFmpeg 做了一个本地视频处理工作站 ClipForge
前端·ffmpeg·electron
源之缘-OFD先行者10 天前
破界渲染:WinForm下的FFmpeg+Vortice极速推流引擎
ffmpeg·winform·推流·h264
源来猿往10 天前
记ffmpeg-8.1.1 之Android库编译(window)
android·ffmpeg
换个昵称都难10 天前
webrtc peerconnection_server 模块介绍
运维·服务器·webrtc
EasyGBS10 天前
延迟直降90%!国标GB28181视频平台EasyGBS支持WebRTC WHIP推流设备接入,让万物互联更简单
音视频·webrtc
Deitymoon10 天前
RV1126+FFMPEG多路码流监控项目
ffmpeg·音视频
芝麻别开门10 天前
GStreamer DASH Demux 知识文档
ffmpeg·dash
换个昵称都难11 天前
webrtc RtpRtcp模块化测试-MockRtpRtcp
webrtc
ltlovezh11 天前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
如意IT11 天前
指纹浏览器检测之BrowserScan的webrtc指纹检测和反检测
自动化·webrtc·chromium·浏览器开发