Agora On-premise 录制 SDK 录制的影片的顶端和底端被截断

Posted

技术标签:

【中文标题】Agora On-premise 录制 SDK 录制的影片的顶端和底端被截断【英文标题】:The top and the bottom end of movies recorded by Agora On-premise recording SDK are cut off 【发布时间】:2021-08-23 05:57:53 【问题描述】:

我想使用 Agora On-premise SDK 开发一个智能手机用户竖屏视频流的记录器。

但是,由于纵横比选项不包括肖像,因此录制的影片的顶部和底部被截断。

我通过重写 Agora Restful Recording Nodejs Sample 来实现这一点。 https://github.com/AgoraIO/Basic-Recording

我可以采取任何方法来解决这个问题吗? 或者,我可以重写 SDK 文件来解决这个问题吗? 或者,视频流在服务器收到后就已经被截断了?

脚本如下。

const  RtcTokenBuilder, RtcRole  = require("agora-access-token")
const AgoraRecordingSDK = require("./AgoraRecordSdk");
const path = require("path");
const fs = require("fs");

require('dotenv').config();
if (process.env.NODE_ENV !== 'production') 
    require('dotenv').config();


const publisher_uid = "*********"
const channelName = "*********"

startRecording(channelName,publisher_uid)

function startRecording(channelName,publisher_uid) 
    let rec = new AgoraRecordingSDK();
    let layout = 
        "canvasWidth": 480,
        "canvasHeight": 480,
        "backgroundColor": "#eeeeee",
        "regions": []
    
    rec.setMixLayout(layout);
    rec.on("joinchannel", function (channel, uid) 
        console.log(`channel joined $channel $uid`);
    );
    rec.on("error", function (err, stat) 
        console.log(`err $err $stat`);
    );
    rec.on("recordingStats", function(stats) 
        console.log(`recording stats $JSON.stringify(stats)`)
    )
    rec.on("userleave", function(uid) 
        console.log(`userleave $uid`);
        if(String(uid) == String(publisher_uid))
            rec.leaveChannel();
        
    );
    rec.on("userjoin", function (uid) 
        //rearrange layout when new user joins
        console.log(`userjoin $uid`);
        if(String(uid) == String(publisher_uid))
            let region = 
                "x": 0,
                "y": 0,
                "width": 480,
                "height": 480,
                "zOrder": 1,
                "alpha": 1,
                "uid": uid
            
            layout.regions.push(region)
            rec.setMixLayout(layout);
        
    );
    let storageDir = path.resolve(__dirname, "./output/"+channelName);
    const token = function () 
        const role = RtcRole.SUBSCRIBER
        const expirationTimeInSeconds = 60 * 150
        const currentTimestamp = Math.floor(Date.now() / 1000)
        const privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds
        const token = RtcTokenBuilder.buildTokenWithUid(process.env.APP_ID, process.env.APP_CERTIFICATE, channelName, Number(process.env.UID), role, privilegeExpiredTs)
        return token
    
    fs.mkdir(storageDir, recursive: true, async (err) => 
        console.log("err:"+err)
        //join channel
        await rec.joinChannel(token(), channelName, Number(process.env.UID), process.env.APP_ID, storageDir);
    )
    return rec;

【问题讨论】:

【参考方案1】:

如果您不希望顶部和底部被切断,您可以将渲染模式更改为适合而不是隐藏。这将在侧面引入黑条,而不是切断视频。您需要像这样在区域对象中添加渲染模式:

let region = 
  "x": 0,
  "y": 0,
  "width": 480,
  "height": 480,
  "zOrder": 1,
  "alpha": 1,
  "renderMode": 1,
  "uid": uid

【讨论】:

感谢您的回答。我用下面的代码试过了,但是录制的视频全是黑色的,什么也没有。让区域= “x”:0,“y”:0,“宽度”:480,“高度”:480,“zOrder”:1,“alpha”:1,“renderMode”:1,“uid”: uid 我也用下面的代码试过了,但结果是一样的。让区域= “x”:0,“y”:0,“宽度”:1280,“高度”:720,“zOrder”:1,“alpha”:1,“renderMode”:1,“uid”: uid 如果您有任何解决方案,请告诉我。 嘿。就我所知,您正在录制视频,但在不添加渲染模式时将侧面切断。一旦添加了 renderMode,录制就会变黑。对吗? 后者是对的,而前者是不对的。不添加renderMode时,有边不切断,只切断上下。一旦我添加了 renderMode,录制就会变黑。 当你说“边”时,你是指包括顶部和底部的边吗?如果是这样,那么你说的是正确的。对不起。 嘿@kokucoco。这对我来说就像一个错误。你能在agora-ticket.agora.io提交一张票吗?

以上是关于Agora On-premise 录制 SDK 录制的影片的顶端和底端被截断的主要内容,如果未能解决你的问题,请参考以下文章

录制 Agora 时只获得一个屏幕

设置 agora.io 录制服务器时出现错误:20,stat_code:3

RTC月度小报5月 |教育aPaaS灵动课堂升级抢先体验VUE版 Agora Web SDK声网Agora与HTC达成合作

Agora 云录制不录制发布者(直播中的主播)

Agora.io 从 LiveStream 录制音频

如何在 Flutter 中实现 Agora 云录制 api?