1

我想在 WinForms 中使用 C# 播放带有 libvlcsharp 的视频 (mp4)。

我使用 Stream 加载媒体,因为文件将被加密,然后我将设法在将其加载到媒体对象之前对其进行解密。

我成功加载并播放了视频,但我无法解析它。

我想解析它,以便在播放之前能够获取 Duration、AudioChannels、FrameRate、Width 等信息。

我调用 Parse(尝试使用每种选项组合),IsParsed 属性更改为 True,但 ParsedStatus 不是 Done 而是 Skipped。

如果我直接加载文件(不使用 srtream)它可以解析。

我的代码:

Stream contentStream = System.IO.File.Open("c:\test\test.mp4" , System.IO.FileMode.Open);
                                                                
Media Video = new Media(utils.GetLibVLC(), new StreamMediaInput(contentStream));

Video.Parse(MediaParseOptions.ParseLocal | MediaParseOptions.ParseNetwork);

while (!Video.IsParsed)  
    System.Threading.Thread.Sleep(50);
                        
if (Video.ParsedStatus == MediaParsedStatus.Done)   //Video.ParsedStatus equals to Skipped
{
    long Duration = Video.Duration;

    foreach (MediaTrack track in Video.Tracks)
    {
        switch (track.TrackType)
        {
            case TrackType.Audio:
                int AudioChannels = (int)track.Data.Audio.Channels;
                int AudioRate = (int)track.Data.Audio.Rate;
                break;
            case TrackType.Video:
                float FrameRate = track.Data.Video.FrameRateNum / track.Data.Video.FrameRateDen;
                int Width = (int)track.Data.Video.Width;
                int Height = (int)track.Data.Video.Height;
                float Ratio = (float)Width / Height;
                break;
        }
    }                            
}

(我知道这很危险,我稍后会改进它)。

有人知道如何解析通过流加载的视频吗?

4

2 回答 2

1

我的解释是不支持。

我看过这行代码:https://code.videolan.org/videolan/vlc/-/blob/a4ca0de9e087e6a6a3bb86c585cf29ad5c553576/src/preparser/preparser.c#L362,这似乎意味着如果解析被跳过不是网络也不是文件。

如果你想要这个功能,你可以在 videolan 的 bugtracker 上提出这个问题。

于 2020-11-30T21:39:42.907 回答
0

你试过这个吗?

var parseStatusTask = Task.Run(async () => await Video.Parse(MediaParseOptions.ParseNetwork));
parseStatusTask.Wait();
于 2021-03-26T19:54:04.853 回答