编码器SDK 4 -推送到发布点

本文关键字:布点 SDK 编码器 | 更新日期: 2023-09-27 18:14:23

我正在用c#编写一个使用EC4 SP2 SDK的应用程序。

我要将文件发布到媒体服务器发布点。我已经搜索并找到了2个关于在发布点上设置和授权的例子,但要么来自较旧的sdk,要么不起作用(并且适用于控制台)。基本上,我的应用程序不编码任何东西,就好像它没有任何东西需要编码一样。在调试模式下,可以看到源文件和服务器的正确属性。

编码过程耗时0秒。我检查了服务器事件的日志,我得到了一个警告"安全系统收到了一个无法解码的授权请求"。我只是不知道该如何更进一步地分手。如有任何帮助,不胜感激。

这是一段代码:

 private void broadcastSourceFileToMediaServer2()
    {             
        using (LiveJob job = new LiveJob())
        {
            String filetoencode = @"c:'temp'niceday.wmv";
            LiveFileSource filesource = job.AddFileSource(filetoencode);
            filesource.PlaybackMode = FileSourcePlaybackMode.Loop;
            job.ActivateSource(filesource);
            job.ApplyPreset(LivePresets.VC1Broadband4x3);
            //don't know which one is good to use 
            job.AcquireCredentials += new EventHandler<AcquireCredentialsEventArgs>(job_AcquireCredentials);
            _myUserName = "indes";
            _pw = PullPW("indes");              
            Uri url = new Uri("http://192.168.1.74:8080/live");
            PushBroadcastPublishFormat pubpoint = new PushBroadcastPublishFormat();
            pubpoint.PublishingPoint = url;
            pubpoint.UserName = _myUserName;
            pubpoint.Password = _pw;
            job.PublishFormats.Add(pubpoint);       
            job.PreConnectPublishingPoint();
            job.StartEncoding();
            statusBox.Text = job.NumberOfEncodedSamples.ToString();
            job.StopEncoding();
            job.Dispose();
        }
  }


    public static string _myUserName { get; set; }
    public static SecureString _pw { get; set; }
    //codificação de Password a enviar
    private static SecureString PullPW(string pw)
    {
        SecureString s = new SecureString();
        foreach (char c in pw) s.AppendChar(c);
        return s;
    }
 static void job_AcquireCredentials(object sender, AcquireCredentialsEventArgs e)
    {
        e.UserName = _myUserName;
        e.Password = _pw;
        e.Modes = AcquireCredentialModes.None;
    }

编码器SDK 4 -推送到发布点

进展:

我设法在服务器上进行身份验证(至少得到一个积极的审计事件)。

I changed from this

//don't know which one is good to use 
        job.AcquireCredentials += new EventHandler<AcquireCredentialsEventArgs>(job_AcquireCredentials);
        _myUserName = "indes";
        _pw = PullPW("indes");              
        Uri url = new Uri("http://192.168.1.74:8080/live");
        PushBroadcastPublishFormat pubpoint = new PushBroadcastPublishFormat();
        pubpoint.PublishingPoint = url;
        pubpoint.UserName = _myUserName;
        pubpoint.Password = _pw;

:

        job.AcquireCredentials += new EventHandler<AcquireCredentialsEventArgs>(job_AcquireCredentials);
        _myUserName = @"mediaservername'user";
        _pw = PullPW("user_password");              
        Uri url = new Uri("http://192.168.1.74:8080/live");
        PushBroadcastPublishFormat pubpoint = new PushBroadcastPublishFormat();
        pubpoint.PublishingPoint = url;

如果你在一边看到它必须在用户名之前包含域(域或计算机名)。这改变了服务器上失败的审计事件,因此我可以消除手动凭据发布点。用户名和密码

现在我正在处理缺乏输出格式的异常。

如何使用平滑流,我设法让我的项目进行,但我没有得到更多的看下面,部分有发布开关类型。忽略文件部分

internal bool StartStream()
{
    Busy = true;
    // Instantiates a new job for encoding
    //  
    //***************************************Live Stream Archive******************************
    if (blnRecordFromFile)
    {
        // Sets up publishing format for file archival type
        FileArchivePublishFormat fileOut = new FileArchivePublishFormat();

        //  job.ApplyPreset(LivePresets.VC1512kDSL16x9);
        // Gets timestamp and edits it for filename
        string timeStamp = DateTime.Now.ToString();
        timeStamp = timeStamp.Replace("/", "-");
        timeStamp = timeStamp.Replace(":", ".");
        // Sets file path and name
        string path = "C:''output''";
        string filename = "Capture" + timeStamp + ".ismv";
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        fileOut.OutputFileName = Path.Combine(path, filename);
        // Adds the format to the job. You can add additional formats as well such as
        // Publishing streams or broadcasting from a port
        job.PublishFormats.Add(fileOut);
    }
    //******************************END OF Stream PORTION****************************************
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //*************************************** Process Files or Live Stream******************************
    if (blnRecordFromFile)
    {
        job.ApplyPreset(LivePresets.VC1IISSmoothStreaming720pWidescreen);
        job = new LiveJob();
        // Verifies all information is entered
        if (string.IsNullOrWhiteSpace(sourcePath) || string.IsNullOrWhiteSpace(destinationPath))
            return false;
        job.Status += new EventHandler<EncodeStatusEventArgs>(StreamStatus);
        LiveFileSource fileSource;
        try
        {
            // Sets file to active source and checks if it is valid
            fileSource = job.AddFileSource(sourcePath);
        }
        catch (InvalidMediaFileException)
        {
            return false;
        }
        // Sets to loop media for streaming
        //   fileSource.PlaybackMode = FileSourcePlaybackMode.Loop;
        // Makes this file the active source. Multiple files can be added 
        // and cued to move to each other at their ends
        job.ActivateSource(fileSource);
    }
    //******************************END OF FILE PORTION****************************************

    // Sets up variable for fomat data
    switch (publishType)
    {
        case Output.Archive:
            // Verifies destination path exists and if not creates it
            try
        {
            if (!Directory.Exists(destinationPath))
                Directory.CreateDirectory(destinationPath);
        }
            catch (IOException)
            {
                return false;
            }
            FileArchivePublishFormat archiveFormat = new FileArchivePublishFormat();
            // Gets the location of the old extention and removes it
            string filename = Path.GetFileNameWithoutExtension(sourcePath);
            // Sets the archive path and file name
            archiveFormat.OutputFileName = Path.Combine(destinationPath, filename + ".ismv");
            job.PublishFormats.Add(archiveFormat);
        break;
        case Output.Publish:
            // Setups streaming of media to publishing point 
            job = new LiveJob();
            // Aquires audio and video devices
            Collection<EncoderDevice> devices = EncoderDevices.FindDevices(EncoderDeviceType.Video);
            EncoderDevice video = devices.Count > 0 ? devices[0] : null;
            for (int i = 0; i < devices.Count; ++i)
                //  devices[i].Dispose();
                devices.Clear();
            devices = EncoderDevices.FindDevices(EncoderDeviceType.Audio);
            EncoderDevice audio = devices.Count > 0 ? devices[0] : null;
            for (int i = 1; i < devices.Count; ++i)
                devices[i].Dispose();
            devices.Clear();
            // Checks for a/v devices
            if (video != null && audio != null)
            {

                //job.ApplyPreset(Preset.FromFile(@"C:'Tempura'LivePreset3.xml"));
                job.ApplyPreset(LivePresets.H264IISSmoothStreamingLowBandwidthStandard);
                job.OutputFormat.VideoProfile.SmoothStreaming = true;
                deviceSource = job.AddDeviceSource(video, audio);
                // Make this source the active one
                job.ActivateSource(deviceSource);
            }
            else
            {
                error = true;
            }
            PushBroadcastPublishFormat publishFormat = new PushBroadcastPublishFormat();
            try
        {
            // checks the path for a valid  publishing point
            publishFormat.PublishingPoint = new Uri(destinationPath);
        }
            catch (UriFormatException)
            {
                return false;
            }
            // Adds the publishing format to the job
            try
        {


            // job.ApplyPreset(LivePresets.VC1IISSmoothStreaming480pWidescreen);
            job.PublishFormats.Add(publishFormat);
            job.PreConnectPublishingPoint();
        }
            catch (Exception e)
            {
                MessageBox.Show(e.StackTrace.ToString());
            }
        break;
        default:
        return false;
    }
    job.StartEncoding();
    return true;
}

遗憾的是我没有足够的代表来评论,所以我不得不把它作为一个答案写下来。

由于你正在启动一个实时作业,为了流式传输,你不应该在StartEncoding之后调用job. stopencoding()。我认为通常你会使用事件来停止编码。如果您开始编码并立即停止它,那么您没有或只有非常小的输出是合乎逻辑的。

我更改了您的代码如下,它似乎工作良好。我猜您的问题是您处置了LiveJob类的实例。您必须在完成整个流的编码之前保持实例存活。所以改变using部分并移除StopEncoding和Dispose就可以了。

    private void broadcastSourceFileToMediaServer2()
    {
        LiveJob job = new LiveJob();
        String filetoencode = @"c:'temp'niceday.wmv";
        LiveFileSource filesource = job.AddFileSource(filetoencode);
        filesource.PlaybackMode = FileSourcePlaybackMode.Loop;
        job.ActivateSource(filesource);
        job.ApplyPreset(LivePresets.VC1Broadband4x3);
        //don't know which one is good to use 
        job.AcquireCredentials += new EventHandler<AcquireCredentialsEventArgs>(job_AcquireCredentials);
        _myUserName = "indes";
        _pw = PullPW("indes");              
        Uri url = new Uri("http://192.168.1.74:8080/live");
        PushBroadcastPublishFormat pubpoint = new PushBroadcastPublishFormat();
        pubpoint.PublishingPoint = url;
        pubpoint.UserName = _myUserName;
        pubpoint.Password = _pw;
        job.PublishFormats.Add(pubpoint);       
        job.PreConnectPublishingPoint();
        job.StartEncoding();
        statusBox.Text = job.NumberOfEncodedSamples.ToString();
    }
    public static string _myUserName { get; set; }
    public static SecureString _pw { get; set; }
    //codificação de Password a enviar
    private static SecureString PullPW(string pw)
    {
        SecureString s = new SecureString();
        foreach (char c in pw) s.AppendChar(c);
        return s;
    }
    static void job_AcquireCredentials(object sender, AcquireCredentialsEventArgs e)
    {
        e.UserName = _myUserName;
        e.Password = _pw;
        e.Modes = AcquireCredentialModes.None;
    }