【发布时间】:2017-01-27 01:47:09
【问题描述】:
我正在制作一个远程助手程序,它应该将屏幕截图发送到我的服务器。我使用 TCP。问题是客户端将高速发送数据包,如果我的服务器速度很慢,我将无法处理即将到来的图像,并且会出现内存溢出异常(因为一张图像占用内存高达 30 MB) .我想出了一个主意:在磁盘上缓冲 avi 文件中的图像(就像许多视频音频流应用程序所做的那样,比如 MJPEG 模式)。我为此找到了完美的库:DirectShow and Video from AForge。 基本上,我在读取它的同时写入一个 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 的文件(将每个图像存储在此文件中的某些分隔符/标题中)?
【问题讨论】: