从本地视频文件VB.Net流式传输视频

时间:2016-08-01 15:35:42

标签: vb.net video

我正在制作一个远程助手程序,应该将截图发送到我的服务器。我用TCP。问题是客户端将以高速发送数据包,如果我的服务器速度很慢,我将无法查看即将发生的图像,并且会出现内存溢出异常(因为一个映像占用内存最多30 MB) 。我想出了一个想法:在磁盘上的avi文件中缓冲图像(就像许多视频 - 音频流应用程序那样 - 像MJPEG模式一样)。我找到了完美的图书馆:来自AForge的DirectShow和视频。    基本上,我在读取它时写入avi文件(以FIFO样式)。 这是用于流式传输的测试项目(我将一些图片写入avi并尝试阅读它):

Public Class Form1
    Dim thr As New Thread(AddressOf write)
    Dim videowriter As New VideoFileWriter
    Dim WithEvents vid As New AVIReader
    Dim WithEvents vidd As DirectShow.FileVideoSource
    Dim cc As Long, used As Boolean
    Dim aa As FilterInfoCollection, bb As New VideoCaptureDevice

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        If File.Exists(Application.StartupPath & "/video/stream.avi") Then File.Delete(Application.StartupPath & "/video/stream.avi")
        thr.Start()
        Thread.Sleep(1000) 'wait so that the avi contains some frames

        vidd = New DirectShow.FileVideoSource(Application.StartupPath & "/video/stream.avi")
        vidd.Start()
    End Sub

    Sub a(sender As Object, args As NewFrameEventArgs) Handles vidd.NewFrame
        draw(args.Frame.Clone)
        Thread.Sleep(100) 'wait again
    End Sub


    Sub draw(ByRef pic As Bitmap)
        If PictureBox1.Image IsNot Nothing Then
            PictureBox1.Image.Dispose()
            PictureBox1.Image = Nothing
        End If

        PictureBox1.Image = pic
    End Sub

    Sub write()
        Dim count As Integer = 0
        Dim crop_bit As New Bitmap(320, 240), bit As Bitmap
        Dim g As Graphics = Graphics.FromImage(crop_bit)

        videowriter.Open(Application.StartupPath & "/video/stream.avi", 320, 240, 100, VideoCodec.MPEG4)

        For Each fil As String In Directory.GetFiles(Application.StartupPath & "/pictures")
            count += 1
            Debug.Print(count)

            bit = Image.FromFile(fil)

            g.DrawImage(bit, 0, 0, 320, 240)

            videowriter.WriteVideoFrame(crop_bit)
            bit.Dispose()
        Next
        'STOP..here
        videowriter.Close()
    End Sub
End Class 

但它不起作用。没错。它创建文件...视频一切,但它没有显示图片框上的图像。似乎当它写入avi时它以WriteOnly打开并且不允许读取(可能?)。有什么办法吗?我听说过队列,但它仍然存储在内存中..必须在磁盘上。是否可以选择制作我自己的MJPEG文件(将此文件中的每个图像存储在某些分隔符/标题中)?

1 个答案:

答案 0 :(得分:1)

30Mb对于屏幕截图来说是巨大的。

您可能会考虑找出它为何如此之大,以及解决问题或压缩图像。任何拥有正常家庭互联网连接甚至普通商家连接的人都不可能流式传输30Mb帧。

如果您的服务器无法跟上,那么流式传输屏幕截图无效,事实上,由于额外的开销,它会变慢。

要解决您的问题,您需要在服务器或网络连接速度太慢时丢帧或缩小图像大小。流式传输无济于事。

对于它的价值,实际的流媒体服务器以多种分辨率和帧速率对媒体进行转码,正是出于这个原因。有光纤互联网连接的人可能能够传输完整的1080P或更好的视频,而2g手机上的某些人可能需要缩放到(180x320?)和几帧/秒,但是如果您和#39;处理需要阅读的屏幕截图。