0

私は 1990 年代初頭に作成された基本的な RIFF AVI を持っており、ネイティブの VB/C# コードで基本的なビデオ プレーヤーを作成しようとしています。ヘッダーによると、古い MS RLE コーデックを使用しています。AVI のビットマップ ヘッダーは、RLE8 で圧縮されていることを示します。

ビットマップ ルール

  1. これは、実用的にゼロから作成され、Windows フォト ビューアーで開かれたビットマップに書き込まれた生の 'xxdc' 圧縮データの結果です。
  2. VirtualDub を使用して抽出された同じフレーム
  3. RLE8ビットマップを解凍する以下のコード

問題は、以下のコードと Windows の両方が同じことを行うことです。一部が欠落しているため、古いVirtualDub ブログ投稿から次のようになります。

(GDI の RLE は AVI の RLE と同じではありません)".

問題は、違いが見つからないことです:(。インターネット上のソースやMSDNの資料が見つかりません。

RLE8 解凍サンプルを htttp://dirkbertels.net/computing/bitmap_decompression.php から VB に移植しました (簡潔にするためにビットマップ構造は省略されています)。それは御馳走になります。問題は、RLE8 を使用する AVI フレームでは正しく動作しないことです。

        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

古い MSRLE.DLL コーデックを使用せずに、VirtualDub、FFMPEG などでそれを行う方法について、私は今途方に暮れています...誰かアイデアはありますか?

4

1 に答える 1

0

解決策を見つけたので、ここで答えて、私のような他の人が出発点になるようにします。

フレームデータは正しく解凍されていました。問題は、RIFF AVI 仕様に正しく従わなかったことです。私のビデオでは、各フレームは前のフレームよりも圧縮解除されています。

于 2015-03-11T01:47:43.893 に答える