You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HaishinKit的BroadcastView(MTHKView)无法全屏及自适应设备宽高比问题求助

问题1:MTHKView无法铺满全屏有黑边

MTHKView默认的视频渲染模式为保持原始比例不裁剪,多余区域会留黑边,仅需修改渲染配置即可解决:
修改BroadcastView的makeUIView方法,初始化MTHKView后新增视频填充模式设置:

public func makeUIView(context: Context) -> MTHKView {
    let view = MTHKView(frame: .zero)
    view.translatesAutoresizingMaskIntoConstraints = false
    // 新增:设置视频等比例缩放铺满整个视图,超出部分自动裁剪
    view.videoGravity = .resizeAspectFill
    view.attachStream(stream)
    stream.delegate = context.coordinator

    DispatchQueue.main.async {
        self.broadcastView = view
    }
    let focusGesture = UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.focusGesture(sender:)))
    view.addGestureRecognizer(focusGesture)
    return view
}

问题2:动态适配不同设备宽高比,无需手动设置视频宽高

你可以在配置RTMPStream时,动态获取当前设备的屏幕尺寸计算对应视频编码宽高,替代原固定写死的1080x1920数值即可,注意H264编码要求宽高为偶数,需要做兼容处理:
修改TestStreamView的onAppear逻辑:

.onAppear {
    rtmpStream = RTMPStream(connection: rtmpConnection)
    guard let stream = rtmpStream else { return }
    stream.orientation = .portrait
    
    // 动态计算适配当前设备的视频宽高
    let screenSize = UIScreen.main.bounds.size
    let screenScale = UIScreen.main.scale
    // 竖屏状态下取短边为宽、长边为高
    var videoWidth = Int(min(screenSize.width, screenSize.height) * screenScale)
    var videoHeight = Int(max(screenSize.width, screenSize.height) * screenScale)
    // 兼容H264编码要求,确保宽高为偶数
    videoWidth = videoWidth % 2 == 0 ? videoWidth : videoWidth + 1
    videoHeight = videoHeight % 2 == 0 ? videoHeight : videoHeight + 1

    stream.captureSettings = [
        .sessionPreset: AVCaptureSession.Preset.hd1920x1080,
        .continuousAutofocus: true,
        .continuousExposure: true,
        .fps: 30
    ]
    stream.videoSettings = [
        .scalingMode: ScalingMode.cropSourceToCleanAperture,
        .width: videoWidth,
        .height: videoHeight,
        .bitrate: 5000000,
        .profileLevel: kVTProfileLevel_H264_Main_AutoLevel,
        .maxKeyFrameIntervalDuration: 2
    ]
    stream.audioSettings = [
        .bitrate: 128000
    ]

    stream.attachAudio(AVCaptureDevice.default(for: .audio))
    stream.attachCamera(DeviceUtil.device(withPosition: .front))
}

如果需要支持横竖屏切换,只需要监听设备方向变化通知,在方向切换后重新计算宽高更新stream.videoSettings即可。


内容的提问来源于stack exchange,提问作者Antonio Chan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:54:03