實現了YUV文件的解析和現實,在VB6.0下開發和執行,新建窗體Form1,添加一個Pictrue控件並設置為控件數組。添加如下代碼
Option Explicit
Private Function yuv2rgb(ByVal y As Long, ByVal u As Long, ByVal v As Long) As Long
Dim r As Long, g As Long, b As Long
r = (1000 * y + 1371 * (v - 128)) / 1000
g = (1000 * y - 336 * (u - 128) - 698 * (v - 128)) / 1000
b = (1000 * y + 1732 * (u - 128)) / 1000
r = Max(0, Min(255, r))
g = Max(0, Min(255, g))
b = Max(0, Min(255, b))
yuv2rgb = RGB(r, g, b)
End Function
Private Sub Test_Click()
Const WIDTH As Integer = 176
Const HEIGHT As Integer = 144
Dim FileLen As Long
Dim FileBuff() As Byte
Dim FramsCount As Integer
Dim i As Integer, j As Integer, k As Integer
Dim y(HEIGHT, WIDTH) As Byte, Image(HEIGHT, WIDTH) As Long
Dim u(HEIGHT / 2, WIDTH / 2) As Byte
Dim v(HEIGHT / 2, WIDTH / 2) As Byte
Dim yy As Byte, uu As Byte, vv As Byte
Dim pos As Long
Open "c:\work\akiyo_qcif.yuv" For Binary As #1
FileLen = LOF(1)
ReDim FileBuff(FileLen)
Get #1, 1, FileBuff()
Close #1
FramsCount = FileLen / (WIDTH * HEIGHT + (WIDTH / 2 * HEIGHT / 2) * 2)
pos = 0
For i = 1 To FramsCount
For j = 1 To HEIGHT
For k = 1 To WIDTH
y(j, k) = FileBuff(pos)
pos = pos + 1
Next k
Next j
For j = 1 To HEIGHT / 2
For k = 1 To WIDTH / 2
u(j, k) = FileBuff(pos)
pos = pos + 1
Next k
Next j
For j = 1 To HEIGHT / 2
For k = 1 To WIDTH / 2
v(j, k) = FileBuff(pos)
pos = pos + 1
Next k
Next j
For j = 1 To HEIGHT
For k = 1 To WIDTH
yy = y(j, k)
uu = u(j / 2, k / 2)
vv = v(j / 2, k / 2)
Image(j, k) = yuv2rgb(yy, uu, vv)
Next k
Next j
Load Picture1(i)
Picture1(i).AutoRedraw = True
For j = 1 To HEIGHT
For k = 1 To WIDTH
Picture1(i).PSet (k, j), Image(j, k)
Next k
Next j
Picture1(i).Visible = True
Next i
Form1.WindowState = 2
End Sub
執行後將視頻中每一幅圖片解析出來,通過Picture控件數組將每個圖片顯示