L___Jeremy 2024-11-18 14:56 采纳率: 0%
浏览 228

uniapp 使用nvue横屏直播 live-pusher,屏幕旋转90度问题

uniapp制作app的nvue使用组件live-pusher ios横屏方向旋转问题

img

代码块

<template>
    <view class="content">
        <live-pusher
            id="livePusher"
            ref="livePusher"
            :style="{ width: windowHeight, height: windowWidth }"
            :url="urls"  
            :mode="mode"
            orientation="horizontal"
            :muted="false"
            :enable-camera="true"
            :auto-focus="true"
            :beauty="beauty"
            :whiteness="whiteness"
            @statechange="statechange"
            @netstatus="netstatus"
            @error="error"
        >
        </live-pusher>
        <cover-view class="utils">
            <cover-view class="beauty" @click="goBack">
                返回
            </cover-view>
            <cover-view class="beauty" @click="stop">
                停止
            </cover-view>
            <cover-view class="beauty" @click="start">
                开始
            </cover-view>
            <cover-view class="beauty" @click="switchCamera">
                切换
            </cover-view>
        </cover-view>    
    </view>
</template>



```javascript
<script>
export default {
    data() {
        return {
            width: '350px',
            height: '1500px',
            mode: 'HD', //流视频模式,可取值:SD(标清), HD(高清), FHD(超清)
            beauty: 9, //美颜,取值范围 0-9(iOS取值范围为1) ,0 表示关闭
            whiteness: 9, // 美白,取值范围 0-9(iOS取值范围为1) ,0 表示关闭
            context: [],
            windowWidth: '', //屏幕可用宽度
            windowHeight: '', //屏幕可用高度
            urls: `rtmp://192.168.20.32:1888/rtmplive/4398`
        };
    },
    onReady() {
        // #ifdef APP-PLUS
        plus.screen.lockOrientation('landscape-primary')
        // plus.navigator.setFullscreen(true)
        // #endif
        // 注意:需要在onReady中 或 onLoad 延时
        this.context = uni.createLivePusherContext('livePusher', this);
        setTimeout(()=>{
            this.context.switchCamera({
                success: (a) => {
                    console.log("livePusher.switchCamera:" + JSON.stringify(a));
                }
            })
            this.context.startPreview({
                success: (a) => {
                    console.log("livePusher.startPreview:" + JSON.stringify(a));
                },
                error:err=>{
                    console.log("livePusherErr.startPreview:" + err)
                }
            })
            
        },1500)
    },
    onLoad() {
        this.initCamera()
    },
    onUnload() {
        // #ifdef APP-PLUS
        plus.screen.lockOrientation('portrait-primary')
        // plus.navigator.setFullscreen(false)
        // #endif
    },
    beforeDestroy() {
        // #ifdef APP-PLUS
        plus.screen.lockOrientation('portrait-primary')
        // plus.navigator.setFullscreen(false)
        // #endif
    },
    onBackPress(e){
      console.log("监听返回按钮事件",e);
      uni.switchTab({
        url:"/pages/index"
      })
      // 此处一定姚要return为true,否则页面不会返回到指定路径
      return true;
    },
    onShow() {
        //开启预览
        this.startPreview();
    },
    methods: {
        statechange(e) {
            console.log('状态变化事件:' + JSON.stringify(e));
        },
        //初始化相机
        initCamera() {
            const _this = this
            uni.getSystemInfo({
                success: function(res) {
                    // console.log("res",res)
                    _this.windowWidth = res.windowWidth;
                    _this.windowHeight = res.windowHeight;
                    let zcs = _this.aliquot(_this.windowWidth, _this.windowHeight);
                    _this.aspect = (_this.windowWidth / zcs) + ':' + (_this.windowHeight / zcs);
                    // console.log('画面比例:' + _this.aspect);
                }
            });
        },
        goBack(){
            uni.navigateBack()
            // #ifdef APP-PLUS
            plus.screen.lockOrientation('portrait-primary')
            // plus.navigator.setFullscreen(false)
            // #endif
        },
        //整除数计算
        aliquot(x, y) {
            if (x % y == 0) return y;
            return this.aliquot(y, x % y);
        },
        netstatus(e) {
            console.log('网络状态通知事件:' + JSON.stringify(e));
        },
        error(e) {
            console.log('渲染错误事件:' + JSON.stringify(e));
        },
        start(){
            this.context.start({
                success: a => {
                    console.log('开始推流:' + JSON.stringify(a));
                },
                error:err=>{
                    console.log(err)
                }
            });
        },
/*        close() {
            this.context.close({
                success: a => {
                    console.log('livePusher.close:' + JSON.stringify(a));
                }
            });
        }, */
        snapshot() {
            this.context.snapshot({
                success: e => {
                    console.log('快照:' +JSON.stringify(e));
                }
            });
        },
        resume() {
            this.context.resume({
                success: a => {
                    console.log('恢复推流:' + JSON.stringify(a));
                }
            });
        },
        pause() {
            this.context.pause({
                success: a => {
                    console.log('暂停推流:' + JSON.stringify(a));
                }
            });
        },
        stop() {
            this.context.stop({
                success: a => {
                    console.log('停止推流:' + JSON.stringify(a));
                }
            });
        },
        switchCamera() {
            this.context.switchCamera({
                success: a => {
                    console.log('切换前后摄像头:' + JSON.stringify(a));
                }
            });
        },
        startPreview() {
            this.context.startPreview({
                success: a => {
                    console.log('开启摄像头预览:' + JSON.stringify(a));
                }
            });
        },
        stopPreview() {
            this.context.stopPreview({
                success: a => {
                    console.log('关闭摄像头预览:' + JSON.stringify(a));
                }
            });
        }
    }
};
</script>

.utils{
        position: fixed;
        top: 20rpx;
        left: 100rpx;
        width: 375px;
        background-color: #FFFFFF;
        text-align: center;
        flex-direction: row;
        opacity: 0.7;
    }
  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-11-19 10:24
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 问题分析

      • 在UniApp的nvue中使用live - pusher组件进行横屏直播时遇到屏幕旋转90度的问题。从提供的代码来看,在iOS设备上已经尝试通过plus.screen.lockOrientation('landscape - primary')来锁定横屏方向,但可能存在一些兼容性或者布局调整的问题导致屏幕显示不正常。
    2. 可能的解决方案

      • 布局适配方面
        • 样式调整
          • live - pusher组件的样式中,目前是通过width: windowHeight, height: windowWidth来设置宽高。这种设置可能在屏幕旋转时没有正确适配。可以尝试根据设备的方向动态计算合适的宽高值。例如,可以在onReady或者onLoad方法中获取设备的方向信息,然后根据方向来设置live - pusher的宽高。
          • 在CSS样式中,对于.utils类的布局,可能需要重新调整其在横屏状态下的位置和大小。比如,在横屏时可能需要调整topleftwidth等属性的值。
        • 响应式布局
          • 使用uni - app的响应式布局技术。例如,可以使用rpx单位结合媒体查询(虽然在nvue中媒体查询的支持可能有限,但可以尝试一些类似的方式)。例如,可以根据设备的宽度范围来设置不同的样式,像@media (min - width: 750rpx) {/* 横屏样式 */}
      • 组件属性与方法方面
        • 检查live - pusher属性
          • 对于live - pusher组件,orientation属性已经设置为horizontal,但可以检查是否有其他属性与屏幕旋转相关。例如,某些设备可能需要特定的视频编码格式或者分辨率设置才能正确显示横屏画面。
        • 事件处理优化
          • statechangenetstatuserror等事件处理方法中,可以添加更多的日志输出或者错误处理逻辑。例如,在statechange事件中,可以根据不同的状态值来判断是否与屏幕旋转问题相关。如果状态值表示视频尺寸或者方向发生了异常变化,可以尝试重新初始化live - pusher组件或者调整相关属性。
      • iOS平台特定问题
        • 权限检查
          • 在iOS设备上,确保应用已经获取了相机和麦克风等相关权限。如果权限不足,可能会导致视频推流或者显示出现问题。可以在onLoad或者onReady方法中添加权限检查的逻辑,如果权限不足,提示用户开启权限。
        • 系统版本兼容性
          • 不同的iOS系统版本可能对live - pusher组件的横屏显示有不同的处理方式。可以针对不同的iOS系统版本进行测试,对于存在问题的版本,可以尝试使用特定的解决方法。例如,在较新的iOS版本中可能需要使用新的API来处理屏幕方向,而在旧版本中可能需要采用不同的布局计算方式。
    3. 代码示例(部分修改示例)

      • onLoad方法中添加权限检查(以相机权限为例)
    onLoad() {
        // 检查相机权限
        uni.authorize({
            scope: 'camera',
            success() {
                console.log('相机权限已获取');
                this.initCamera();
            },
            fail() {
                uni.showModal({
                    title: '提示',
                    content: '需要开启相机权限才能进行直播',
                    showCancel: true,
                    success(res) {
                        if (res.confirm) {
                            // 引导用户去设置页面开启权限
                            uni.openSetting();
                        }
                    }
                });
            }
        });
    },
    
    • 调整live - pusher组件的宽高计算方式(假设根据设备方向来计算)
    onReady() {
        // #ifdef APP - PLUS
        plus.screen.lockOrientation('landscape - primary');
        // plus.navigator.setFullscreen(true);
        // #endif
        // 注意:需要在onReady中 或 onLoad 延时
        this.context = uni.createLivePusherContext('livePusher', this);
        setTimeout(() => {
            // 获取设备方向
            uni.getSystemInfo({
                success: (res) => {
                    if (res.orientation === 'landscape') {
                        this.windowWidth = res.screenWidth;
                        this.windowHeight = res.screenHeight;
                    } else {
                        this.windowWidth = res.screenHeight;
                        this.windowHeight = res.screenWidth;
                    }
                }
            });
            this.context.switchCamera({
                success: (a) => {
                    console.log("livePusher.switchCamera:" + JSON.stringify(a));
                }
            });
            this.context.startPreview({
                success: (a) => {
                    console.log("livePusher.startPreview:" + JSON.stringify(a));
                },
                error: err => {
                    console.log("livePusherErr.startPreview:" + err);
                }
            });
    
        }, 1500);
    },
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月18日