У меня есть базовый RIFF AVI, сделанный в начале 1990-х годов, и я являюсь типичным, чтобы сделать основной видеопроигрыватель в собственном коде VB/C#. Согласно заголовку, он использует старый кодек MS RLE. Заголовок битмапа в AVI указывает, что он сжат RLE8.RIFF AVI RLE отличается от GDI RLE
- является результатом сырой «xxdc» сжатых данных, записанных в растр прагматично, созданный с нуля и был открыт в средстве просмотра фотографий Windows
- тот же кадр извлекали с помощью VirtualDub
- в код ниже декомпрессирования растровой карты RLE8
Проблема заключается и в коде ниже И Windows делает то же самое, части пропускают whi ch приводит меня к следующему от старого VirtualDub blog post;
(RLE GDI не является такой же, как RLE AVI в)».
Проблема в том, что я не могу найти разницу :(. Я не могу найти никаких источников в интернете или какой-либо материал на сайте MSDN .
Я поместил образец декомпрессии RLE8 из htttp: //dirkbertels.net/computing/bitmap_decompression.php в VB (структуры растровых изображений опущены для краткости) .Это работает. Проблема в том, что он не работает правильно для AVI рамы, которые используют RLE8.
Dim firstByte As Byte
Dim secondByte As Byte
Dim currX As UInteger = 0
Dim currY As UInteger = 0
Dim i As UInteger
Do
firstByte = br.ReadByte
If 0 <> firstByte Then
' Encoded Mode
secondByte = br.ReadByte
For i = 0 To firstByte - 1
frame.SetPixel(currX, currY, _bitmap.biClut(secondByte))
currX += 1
Next i
Else
' Absolute Mode
firstByte = br.ReadByte ' store next byte
Select Case firstByte
Case 0 ' new line
currX = 0
currY += 1 ' move cursor to beginning of next line
Case 1 ' end of bitmap
Exit Do
Case 2 ' delta = goto X and Y
currX += CInt(br.ReadByte) ' read byte and add value to x value
currY += CInt(br.ReadByte) ' read byte and add value to y value
Case Else
For i = 0 To firstByte - 1
secondByte = br.ReadByte
frame.SetPixel(currX, currY, _bitmap.biClut(secondByte))
currX += 1
Next i
'If 0 <> (firstByte And &H1) Then
' br.ReadByte()
'End If
If firstByte And &H1 Then ' if the run doesn't end on a word boundary,
br.ReadByte()
End If
End Select
End If
Loop
Теперь я в затруднении относительно того, как VirtualDub, FFMPEG и другие делают это без использования старого кодека MSRLE.DLL ... Есть ли у кого-нибудь идеи?