Page 1 of 1

VLC Pause freeze

Posted: 01 Jun 2020 11:03
by mystery123sk
I have a custom renderer to render the video to Bitmap. The problem is, when I use pause function with seek (PauseAt in code), the video stops working after a few PauseAt calls. The CurrenBitmap returns always the same image - same image is rendered by VLC. It happens after several calls of PauseAt. The PauseAt calls VLC's mediaPlayer.Position = perc and mediaPlayer.SetPause(true).

After I use Play again, the video resumes without problem (and I can use the PauseAt several times again).

Is there a recommended way to use Pause in VLC to seek the video randomly?

I also noticed, the freeze happens a lot faster, when I set the mediaPlayer.Position to 0).

Here is my code (using C#):

Code: Select all

unsafe class VideoFileRenderer { public BitmapSource CurrenBitmap => bsg.RenderBitmapSource(); public bool Open(string filename) { mediaPlayer = new MediaPlayer(VLCHandler.LibVLC); //videoView.MediaPlayer = mediaPlayer; media = new Media(VLCHandler.LibVLC, filename, FromType.FromPath, "input-repeat=1000000"); media.Parse().Wait(); UInt32 width = 0; UInt32 height = 0; UInt32 pitch = 0; foreach (var track in media.Tracks) { if (track.TrackType != TrackType.Video) continue; width = track.Data.Video.Width; height = track.Data.Video.Height; //TODO: align to 4 bytes pitch = width * 4; originalWidth = (int)width; originalHeight = (int)height; originalStride = (int)pitch; bsg.Init(originalWidth, originalHeight); memory = Marshal.AllocHGlobal((int)(height * pitch)); } mediaPlayer.SetVideoFormat("RV32", width, height, pitch); mediaPlayer.SetVideoCallbacks(LockCB, UnlockCb, DisplayCb); //mediaPlayer.EnableHardwareDecoding = true; mediaPlayer.PositionChanged += OnPositionChanged; mediaPlayer.SeekableChanged += OnSeekableChanged; mediaPlayer.EndReached += OnEndReached; mediaPlayer.Pause(); mediaPlayer.Position = -0.05f; Trace.WriteLine("Opened: " + filename); //Thread.Sleep(1000); return true; } private void OnEndReached(object sender, EventArgs e) { Trace.WriteLine("OnEndReached"); ThreadPool.QueueUserWorkItem(_ => { mediaPlayer.Stop(); var ret = mediaPlayer.Play(); }); } public void PauseAt(float perc) { //Trace.WriteLine("Set new pos = " + perc.ToString()); mediaPlayer.Position = perc; mediaPlayer.Play(); mediaPlayer.SetPause(true); //Thread.Sleep(10); } private void OnSeekableChanged(object sender, MediaPlayerSeekableChangedEventArgs e) { Trace.WriteLine("OnSeekableChanged:" + e.Seekable.ToString()); } private void OnPositionChanged(object sender, MediaPlayerPositionChangedEventArgs e) { //Trace.WriteLine("New pos:" + e.Position.ToString()); } public bool Play() { if (media == null) return false; mediaPlayer.SetRate(1.0f); if (!mediaPlayer.Play(media)) return false; mediaPlayer.Position = 0.5f; Trace.WriteLine("Play triggered"); return true; } public IntPtr LockCB(IntPtr opaque, IntPtr planes) { //Trace.Write("L"); Marshal.WriteIntPtr(planes, memory); return IntPtr.Zero; } public void UnlockCb(IntPtr opaque, IntPtr picture, IntPtr planes) { //Trace.Write("U"); } public void DisplayCb(IntPtr opaque, IntPtr picture) { //Trace.Write("D"); byte* pMem = (byte*)memory.ToPointer(); for (int y = 0; y < bsg.Height; y++) { int fromY = originalHeight * y / bsg.Height; for (int x = 0; x < bsg.Width; x++) { int fromX = originalWidth * x / bsg.Width; int originalOffset = fromY * originalStride + 4 * fromX; int offset = y * bsg.RawStride + 4 * x; bsg.RawImage[offset + 0] = pMem[originalOffset + 0]; bsg.RawImage[offset + 1] = pMem[originalOffset + 1]; bsg.RawImage[offset + 2] = pMem[originalOffset + 2]; bsg.RawImage[offset + 3] = pMem[originalOffset + 3]; } } //currenBitmap = bsg.RenderBitmapSource(); } Media media; MediaPlayer mediaPlayer; IntPtr memory; int originalWidth = 0; int originalHeight = 0; int originalStride = 0; BitmapSourceGenerator bsg = new BitmapSourceGenerator(); //BitmapSource currenBitmap; }
I'm using LibVLCSharp 3.4.5.0 and LibVLC 3.0.10.

Re: VLC Pause freeze

Posted: 01 Jun 2020 12:29
by mfkl
Hi,

Please share full code in a git repo. Also some options might help for your use case here https://wiki.videolan.org/VLC_command-line_help

Re: VLC Pause freeze

Posted: 01 Jun 2020 14:02
by mystery123sk
I made a repository, where you can use the scrollbar - after you drag the scrollbar for a few seconds, the preview seek will stop (video will generate the same picture all the time).

https://github.com/mystery123sk/VLCRenderToBitmap

Re: VLC Pause freeze

Posted: 01 Jun 2020 17:57
by mfkl
Can you share your logs please?

Re: VLC Pause freeze

Posted: 02 Jun 2020 08:43
by mystery123sk
I've added it here: https://github.com/mystery123sk/VLCRenderToBitmap/tree/master/PauseFreezeLog

I've played with the scrollbar for about 10 seconds and then it freezes.

Re: VLC Pause freeze

Posted: 03 Jun 2020 10:07
by mfkl
logs mention --input-fast-seek so maybe try that but I doubt that's it.

Try having a look at existing code that uses this API to help troubleshooting your code, like https://code.videolan.org/mfkl/libvlcsharp-samples/-/blob/master/PreviewThumbnailExtractor.Skia/Program.cs or Vlc.DotNet WPF control.

Re: VLC Pause freeze

Posted: 03 Jun 2020 11:30
by mystery123sk
The existing code won't help me much, since it extracts the images from start of the file to the end. The problem appears when randomly seeking the file. It looks like I should wait for something once I seek the file to random position - because when I try the seek the file in VLC player, it seeks a lot slower than my application (let's vlclib breath for a moment after seek?).

It's a really pity the documentation and examples for vlclib are few levels below poor. It's a great lib, but to get real help is almost impossible.