将“sout”保存到文件

时间:2018-06-07 12:32:34

标签: c# streaming vlc freeze libvlc

我正在使用VLCdotNet包在WinForm应用程序上显示流。 它只在显示时效果很好。

然后,我添加了记录流的可能性(将其保存到file.avi) 保存流非常有效。

可悲的是,当我开始录制时,显示屏会冻结。 显示第一帧,然后保持这样。仅此而已。 我无法监控记录的内容,因此很烦人。 就像我说的那样,.avi文件很好,只是显示冻结。

这是代码:

vlcControl1.Stop(); //stop because recording requires to restart the .Play()
vlcControl1.SetMedia(medias[0], new string[] { ":sout=#transcode{vcodec=h264,vb=1024,acodec=mpga,ab=128,channels=2,samplerate=44100}:duplicate{dst=display,dst=std{access=file,mux=avi,dst='C:\stream\videos\name.avi'}}" });
vlcControl1.Play();

我打赌这与sout命令有关,但我没有看到错误。 我试图更改dst=displaydst=std的顺序,将第一个或第二个,第一个或第二个相同的效果。

如果我只回流.Play(),它会成功显示回来。

vlcControl1.Stop(); 
vlcControl1.SetMedia(medias[0]);
vlcControl1.Play();

所以我认为它确实来自sout命令的一些参数。

编辑: 我收到了vlc论坛管理员的一些消息......

  

Sout = display在vlcControl1中不起作用。

是否有人考虑过任何解决方法或hack可能会解决这个问题?

1 个答案:

答案 0 :(得分:0)

...良好 我决定找一个“解决方法”。

  • 使用vlcControl2
  • 创建了新的visible=false
  • 我在玩游戏时不会碰到所有vlcControl1
  • 我只是使用vlcControl2作为隐藏的临时组件来记录文件......

    //play the stream on screen
    vlcControl1.Stop();
    vlcControl1.SetMedia(medias[0]);
    vlcControl1.Play();
    //record it from the hidden control
    vlcControl2.Stop();
    vlcControl2.SetMedia(medias[0], new string[] { ":sout=#transcode{vcodec=h264,vb=1024,acodec=mpga,ab=128,channels=2,samplerate=44100}:duplicate{dst=nodisplay,dst=std{access=file,mux=avi,dst='C:\stream\videos\name.avi'}}" });
    vlcControl2.Play();
    
    //stop recording
    vlcControl2.Stop();
    //this just because i prefer to clean things
    vlcControl2.SetMedia("");
    

使用这种方法可能根本不干净,因为它加载了两倍的数据......但至少它可以工作......