2012-05-02 17 views
2

AVIムービーを作成するDelphi 6アプリケーションがあります。私は、圧縮されていないビデオフレームを持つAVIファイルを書くことができるようになってきました。AVIStreamSetFormat()コール中にAVIERR_MEMORYエラーが発生しました。

hr := AVIStreamSetFormat(
     FAvi_.thePsCompressed, 
     0, 
     @dsBmih, 
     dsBmih.biSize + dsBmih.biClrUsed * sizeof(RGBQUAD)); 

は、なぜ私はこのエラーを取得していますし、私はそれを修正するために何を行うことができます:私は、圧縮されたビデオストリームを作成しようとすると、私はAVIStreamSetFormat()を呼び出すとき、私はAVIERR_MEMORYエラーを取得しますか? I半径コンプレッサによってシネパックコードを選択した後

ここAVISaveOptionsへの呼び出しを使用して、圧縮オプションのデータ構造の内容です()。私が選択した場合注、私はまだエラーが出る異なるコンプレッサー:ここ

fccType: 0 
fccHandler: 1684633187 
dwKeyFrameEvery: 0 
dwQuality: 8800 
dwBytesPerSecond: 0 
dwFlags: 8 
lpFormat: nil 
cbFormat: 0 
lpParms: nil 
cbParms: 4 
dwInterleaveEvery: 0 

はTBitmapHeaderInfoデータ構造の内容である:ここで

biSize: 40 
biWidth: 320 
biHeight: -240 
biPlanes: 1 
biBitcount: 32 
biCompression: 0 
biSizeImage: 307200 
biXPelsPerMeter: 0 
biYPelsPerMeter: 0 
biClrUsed: 0 
biClrImportant: 0 

はAVIStreamSetFormatへの呼び出しが含まれている方法であり、 ():

function TAviWriterWithCompression.compressionDirect(
           opts: PAVICOMPRESSOPTIONS; 
           bShowDialog: boolean; 
           hparent: HWND; 
           dsBmih: TBitmapInfoHeader; 
           sizeImage: integer; 
           DIBValues: Pointer; 
           framesPerSecond: integer): HRESULT; 
var 
    lastErr: string; 
    hr: HRESULT; 
    myopts: TAVICOMPRESSOPTIONS; 
    aopts: array[0..0] of PAVICOMPRESSOPTIONS; 
    res: Bool; 
begin 
    if not FIsVirginFile then 
    begin 
     // The output file already has at least one audio or video frame so 
     // setting or changing the compression format is not allowed. 
     Result := LongInt(AVIERR_ERROR); 

     // =========================== EXIT POINT ============== 
     exit; 
    end; // if not Assigned(FAvi_) then 

    if not Assigned(FAvi_) then 
    begin 
     Result := LongInt(AVIERR_BADHANDLE); 

     // =========================== EXIT POINT ============== 
     exit; 
    end; // if not Assigned(FAvi_) then 

    // Check the utility object for an error. 
    if (FAvi_.iserr) then 
    begin 
     Result := LongInt(AVIERR_ERROR); 
     // =========================== EXIT POINT ============== 
     exit; 
    end; // if (FAvi_.iserr) then 

    // Make sure the compressor has not already been selected. 
    if Assigned(FAvi_.thePsCompressed) then 
    begin 
     Result := LongInt(AVIERR_COMPRESSOR); 
     // =========================== EXIT POINT ============== 
     exit; 
    end; // if (FAvi_.iserr) then 

    // create the stream, if it wasn't there before 
    if not Assigned(FAvi_.thePs) then 
    begin 
     hr := createVideoStream(dsBmih, framesPerSecond); 

     if hr <> AVIERR_OK then 
     begin 
      Result := hr; 

      // Set the error flag in our utility object. 
      FAvi_.iserr := true; 

      // =========================== EXIT POINT ============== 
      exit; 
     end; // if hr <> AVIERR_OK then 
    end; // if not Assigned(FAvi_.thePs) then 

    // set the compression, prompting dialog if necessary 
    if not Assigned(FAvi_.thePsCompressed) then 
    begin 
     ZeroMemory(@myopts, sizeof(myopts)); 

     if Assigned(opts) then 
      // Use the provided compressor options 
      aopts[0] := opts 
     else 
      // Use our initialized (empty) variable. 
      aopts[0] := @myopts; 

     // Does the caller want to show the compressor dialog box? 
     if (bShowDialog) then 
     begin 
      res := AVISaveOptions(hparent, 0, 1, FAvi_.thePs, aopts[0]); 

      if not res then 
      begin 
       AVISaveOptionsFree(1, aopts[0]); 

       // Set the error flag. 
       FAvi_.iserr := true; 

       Result := LongInt(AVIERR_USERABORT); 

       // =========================== EXIT POINT ============== 
       exit; 
      end; // if res = 0 then 
     end; // if (bShowDialog) then 

     hr := AVIMakeCompressedStream(FAvi_.thePsCompressed, FAvi_.thePs, aopts[0], nil); 

     if hr <> AVIERR_OK then 
     begin 
      Result := hr; 

      // Set the error flag in our utility object. 
      FAvi_.iserr := true; 

      // =========================== EXIT POINT ============== 
      exit; 
     end; // if hr <> AVIERR_OK then 

     AVISaveOptionsFree(1, aopts[0]); 
     postDiagMsg('Avi::compression after AVISaveOptionsFree()'); 

     // >>>> This is where I get the AVIERR_MEMORY error. 
     hr := AVIStreamSetFormat(FAvi_.thePsCompressed, 0, @dsBmih, dsBmih.biSize + dsBmih.biClrUsed * sizeof(RGBQUAD)); 

     if hr <> AVIERR_OK then 
     begin 
      Result := hr; 

      // Set the error flag in our utility object. 
      FAvi_.iserr := true; 

      // =========================== EXIT POINT ============== 
      exit; 
     end; // if hr <> AVIERR_OK then 
    end; // if not Assigned(FAvi_.thePsCompressed) then 

    Result := AVIERR_OK; 
end; 

答えて

3

それはTBitmapHeaderInfoからbiHeightの負の値によって引き起こされるかもしれませんDIBセクションに格納されているビット値は、垂直方向に反転したイメージを表します。

一部のコーデックではこれを解決できない場合があります。そのため、画像ヘッダのサイズとビット深度を、選択したビデオストリームコンプレッサで処理できることを確認してください。サポートされている画像フォーマットのみを使用する必要があります。コーデックが反転画像をサポートしていない場合は、DIB画像データを反転し、手動で画像ヘッダを手動で変更する必要があります。

関連する問題