線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1327
推到 Plurk!
推到 Facebook!

要如何直接在記憶體內播放avi檔呢?

尚未結案
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-09 21:23:50 IP:61.59.xxx.xxx 未訂閱
通常的AVI檔的播放是用現成的播放程式從硬碟以檔案格式叫入再Play. 現想自己寫個程式把檔案load到記憶體buffer再直接play這個buffer. 請高手指教.謝謝! 發表人 - chenbc 於 2004/01/09 21:31:37
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-10 09:59:07 IP:61.66.xxx.xxx 未訂閱
您好, 看看這是不是你要的。 http://delphi.ktop.com.tw/topic.php?topic_id=19376 http://delphi.ktop.com.tw/topic.php?topic_id=13502 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-10 16:34:39 IP:61.59.xxx.xxx 未訂閱
anpino 您好, 有找到地方,只是程式是Delphi寫的而我用的是Builder...@_@" 是否有地方可以找到Builder6.0的範例可參考. 順便把程式列出給有興趣的人看;如果有人會改成Builder用的來分享就更好了. ---------------------------------------------  
 
unit AVICtrl;    interface    {                           TAVIControl V 0.9b                                  Programmed by                                  Andrea Molino
                           easytarg@mbox.vol.it
}    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, CommCtrl;    Type
  TAVIControlState = (acsClose, acsOpen, acsPlay);
  TAVIControlError = (acrOK, acrOpenFailed, acrPlayFailed, acsSeekFailed);      TAVIControl = class(TWinControl)
  private
    FAVIState: TAVIControlState;
    FAVIName: String;
    FFrameFrom: SmallInt;
    FFrameTo: SmallInt;
    FFrameSeek: SmallInt;
    FAutoSize: Boolean;
    FAutoRepeat: Boolean;
    FLastOpStatus: TAVIControlError;
    FAux: String;
    Procedure SetAVIState(Val: TAVIControlState);
    Procedure SetAVIName(Val: String);
    Procedure SetFrameFrom(Val: SmallInt);
    Procedure SetFrameTo(Val: SmallInt);
    Procedure SetFrameSeek(Val: SmallInt);
    Procedure SetAutoSize(Val: Boolean);
    Procedure SetAutoRepeat(Val: Boolean);
    Function  GetLastOpStatus: String;
  protected
    procedure CreateParams(var Params: TCreateParams); Override;
    procedure CreateWnd; Override;
  public
    Constructor Create(AOwner: TComponent); override;
    Destructor Destroy; override;
    Function  Open(FileName: String): Boolean;
    Procedure Close;
    Function  Play(FName: String; RepCount: SmallInt): Boolean;
    Function  Seek(Frame: SmallInt): Boolean;
    Procedure Stop;
  published
    Property AVIState: TAVIControlState Read FAVIState Write SetAVIState Default acsClose;
    Property AVIName: String Read FAVIName Write SetAVIName;
    Property FrameFrom: SmallInt Read FFrameFrom Write SetFrameFrom Default 0;
    Property FrameTo: SmallInt Read FFrameTo Write SetFrameTo Default -1;
    Property FrameSeek: SmallInt Read FFrameSeek Write SetFrameSeek Default 0;
    Property AutoSize: Boolean Read FAutoSize Write SetAutoSize Default False;
    Property AutoRepeat: Boolean Read FAutoRepeat Write SetAutoRepeat Default True;
    Property ZStatus: String Read GetLastOpStatus Write FAux;
    property Align;
    property Enabled;
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
  end;    procedure Register;    implementation    Constructor TAVIControl.Create(AOwner: TComponent);
Begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle -[csSetCaption];
  FAVIState := acsClose;
  FFrameFrom := 0;
  FFrameTo := -1;
  FAutoSize := False;
  FAutoRepeat := True;
  FLastOpStatus := acrOK;
  Width := 30;
  Height := 30;
End;    Destructor TAVIControl.Destroy;
Begin
  Inherited Destroy;
End;    procedure TAVIControl.CreateParams(var Params: TCreateParams);
begin
{ACS_AUTOPLAY    - Starts playing the animation as soon as the animation clip is opened.
 ACS_CENTER      - Centers the animation in the animation control's window.
 ACS_TRANSPARENT - Draws the animation using a transparent background rather than
                   the background color specified in the animation clip.}
  InitCommonControls;
  Inherited CreateParams(Params);
  CreateSubClass(Params, 'SysAnimate32');
  With Params do
  Begin
    Style := Style Or ACS_TRANSPARENT;
    If Not FAutoSize Then Style := Style Or ACS_CENTER;
  End;
end;    procedure TAVIControl.CreateWnd;
begin
  Inherited CreateWnd;
  If FAVIState = acsOpen Then Open(FAVIName);
  If FAVIState = acsPlay Then
  Begin
    Open(FAVIName);
    Play('', 0);
  End;
end;    Procedure TAVIControl.SetAVIState(Val: TAVIControlState);
Begin
  If Val <> FAVIState Then
  Begin
    FAVIState := Val;
    Case FAVIState Of
      acsOpen : Begin
                  Open(FAVIName)
                End;
      acsPlay : Begin
                  Open(FAVIName);
                  Play('', 0);
                End;
      acsClose: Close;
    End;
  End;
End;    Procedure TAVIControl.SetAVIName(Val: String);
Var
  FTmpState: TAVIControlState;
Begin
  If Val <> FAVIName Then
  Begin
    FAVIName := Val;
    FTmpState := FAVIState;
    Close;
    If FTmpState = acsOpen Then Open(FAVIName);
    If FTmpState = acsPlay Then Play('', 0);
  End;
End;    Procedure TAVIControl.SetFrameFrom(Val: SmallInt);
Begin
  If Val <> FFrameFrom Then
  Begin
    FFrameFrom := Val;
    If FAVIState = acsPlay Then Play('', 0);
  End;
End;    Procedure TAVIControl.SetFrameTo(Val: SmallInt);
Begin
  If Val <> FFrameTo Then
  Begin
    FFrameTo := Val;
    If FAVIState = acsPlay Then Play('', 0);
  End;
End;    Procedure TAVIControl.SetFrameSeek(Val: SmallInt);
Begin
  If Val <> FFrameSeek Then
  Begin
    FFrameSeek := Val;
    Seek(FrameSeek);
  End;
End;    Procedure TAVIControl.SetAutoSize(Val: Boolean);
Begin
  If Val <> FAutoSize Then
  Begin
    FAutoSize := Val;
    RecreateWnd;
  End;
End;    Procedure TAVIControl.SetAutoRepeat(Val: Boolean);
Begin
  If Val <> FAutoRepeat Then
  Begin
    FAutoRepeat := Val;
    If FAVIState = acsPlay Then Play('', 0);
  End;
End;    Function TAVIControl.GetLastOpStatus: String;
Begin
  Case FLastOpStatus Of
    acrOK        : Result := 'OK';
    acrOpenFailed: Result := 'Open Failed';
    acrPlayFailed: Result := 'Play Failed';
  End;
End;    Function TAVIControl.Open(FileName: String): Boolean;
Var
  Res: LongInt;
Begin
  FLastOpStatus := acrOK;
  If FAVIState <> acsClose Then Close;
  Res := SendMessage(Handle, ACM_OPEN, 0, LongInt(PChar(FileName)));
  FAVIName := FileName;
  If Res <> 0 Then FAVIState := acsOpen
  Else FLastOpStatus := acrOpenFailed;
  Result := (Res <> 0);
End;    Procedure TAVIControl.Close;
Var
  Res: LongInt;
Begin
  FLastOpStatus := acrOK;
  Res := SendMessage(Handle, ACM_OPEN, 0, 0);
  FAVIState := acsClose;
  Repaint;
End;    Function TAVIControl.Seek(Frame: SmallInt): Boolean;
Var
  Res: LongInt;
Begin
  FLastOpStatus := acrOK;
  If FAVIState = acsClose Then Open(FAVIName)
  Else If FAVIState = acsPlay Then Stop;
  If FAVIState <> acsClose Then
  Begin
    Res := SendMessage(Handle, ACM_PLAY, 1, MAKELONG(Frame, Frame));
    If Res = 0 Then FLastOpStatus := acsSeekFailed;
    Result := (Res <> 0);
  End
  Else Result := False;
End;    Function TAVIControl.Play(FName: String; RepCount: SmallInt): Boolean;
Var
  Res: LongInt;
  Rep: SmallInt;
Begin
  FLastOpStatus := acrOK;
  If FName = '' Then Open(FAVIName)
  Else Open(FName);
  If FAVIState <> acsClose Then
  Begin
    If FAutoRepeat And (RepCount = 0) Then Rep := -1
    Else If RepCount = 0 Then Rep := 1
    Else Rep := RepCount;
    Res := SendMessage(Handle, ACM_PLAY, Rep, MAKELONG(FFrameFrom, FFrameTo));
    If (Res <> 0) And FAutoRepeat Then FAVIState := acsPlay
    Else FLastOpStatus := acrPlayFailed;
    Result := (Res <> 0);
  End
  Else Result := False;
End;    Procedure TAVIControl.Stop;
Var
  Res: LongInt;
Begin
  FLastOpStatus := acrOK;
  If FAVIState <> acsClose Then
  Begin
    Res := SendMessage(Handle, ACM_PLAY, 0, MAKELONG(0, 0));
    If FAVIState = acsPlay Then FAVIState := acsOpen;
  End;
End;    procedure Register;
begin
  RegisterComponents('MyGold', [TAVIControl]);
end;    end.    
發表人 - chenbc 於 2004/01/10 16:57:02
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-10 18:11:24 IP:61.66.xxx.xxx 未訂閱
我幫你轉一部分, 剩下的只要比照原來的程式碼改就可以了。 前面有"//"的部分是原來的DELPHI語法,接著是轉成的BCB語法。    
//unit AVICtrl;
#include "AVICtrl.h"
/*
interface    {                           TAVIControl V 0.9b                                  Programmed by                                  Andrea Molino
                           easytarg@mbox.vol.it
}*/    //uses
//  Windows, Messages, SysUtils, Classes, Graphics, Controls, CommCtrl;
#include 
... 
#include     //  TAVIControl = class(TWinControl)
class TAVIControl : public TWinControl
{
//  private
//    FAVIState: TAVIControlState;
//  ... 
private:
    TAVIControlState *FAVIState;    //    Procedure SetAVIState(Val: TAVIControlState);
   void __fastcall SetAVIState(TAVIControlState*);    先改到這裡,星期一待續...    > >    -------------------------------
數學系是內功很強(邏輯/分析)  資工系是招式很多(程式技巧) 就像令狐沖
        
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-11 17:17:42 IP:61.59.xxx.xxx 未訂閱
等待武林高手anpino的續集了.
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-12 10:42:12 IP:61.66.xxx.xxx 未訂閱
引言: 等待武林高手anpino的續集了.
我不是高手啦~~ 大家互相學習。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-13 23:46:52 IP:61.59.xxx.xxx 未訂閱
感謝anpino,內力實在高強,在下研究研究了.只是從原來的程式上看不出是那幾行是在做記憶體播放?還請大俠指教指教. 感謝
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-14 11:09:49 IP:61.66.xxx.xxx 未訂閱
引言: 從原來的程式上看不出是那幾行是在做記憶體播放?還請大俠指教指教. 感謝
請找 Function TAVIControl.Play(FName: String; RepCount: SmallInt): Boolean; 這個函式的內容。 有些是
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-14 16:51:09 IP:218.166.xxx.xxx 未訂閱
Chenbc 你好: 請問,所謂的「記憶體播放」是指什麼呢?其流程是? 是 1. 先把AVI檔案整個讀到記憶體中再播放,還是 2. 把AVI檔案中全部的frame預先讀到記憶體中,然後一張張播放(顯示)出來? 因為在下看不懂Chenbc所問的「記憶體播放」,所以想請教一下,麻煩Chenbc解釋一下囉~
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-14 18:13:35 IP:61.59.xxx.xxx 未訂閱
是 1. 先把AVI檔案整個讀到記憶體中再播放,這樣較順暢.有時在讀硬碟或光碟(尤其是光碟)讀檔轉換就會不順暢. 多多指教囉
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-26 08:15:44 IP:61.66.xxx.xxx 未訂閱
您好, 讀到記憶體中可以用TMemoryStream。 <>< face="Verdana, Arial, Helvetica">引言: 是 1. 先把AVI檔案整個讀到記憶體中再播放,這樣較順暢.有時在讀硬碟或光碟(尤其是光碟)讀檔轉換就會不順暢. 多多指教囉 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Programmers Guide http://anpino.begin.8d8d.com
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-26 13:14:19 IP:61.59.xxx.xxx 未訂閱
Anpino您好,過年了還看到您真是高興. 這幾天還在找資料這題的得分是非您莫屬了不過尚未完美解出, 請問如何用TMemoryStream來播放avi呢? 指教指教. 新年快樂. 發表人 - chenbc 於 2004/01/26 18:36:33
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-03-01 11:09:42 IP:61.66.xxx.xxx 未訂閱
引言: Anpino您好,過年了還看到您真是高興. 這幾天還在找資料這題的得分是非您莫屬了不過尚未完美解出, 請問如何用TMemoryStream來播放avi呢? 指教指教. 新年快樂.
抱歉... 因為在飆專案, 所以農曆年後一陣子沒來。 謝謝您的祝福, 其實新年非常忙碌...忙著在方城之戰廝殺...(<-- 踢飛 XD||| "如何用TMemoryStream來播放avi" 這問題...(在下真的對avi很不熟^^;;), MSDN有現成的example可參考: 1.Playing the AVI File http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_playing_the_avi_file.asp 2.Opening Streams in an AVI File and Closing the File http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_opening_streams_in_an_avi_file_and_closing_the_file.asp 其中所用的avi stream 可以用TMemoryStream代替。< > 也祝您今年平安順心.< > ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗 Programmers Guide http://anpino.begin.8d8d.com 發表人 -
Chenbc
一般會員


發表:31
回覆:33
積分:12
註冊:2004-01-06

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-03-02 14:49:20 IP:61.59.xxx.xxx 未訂閱
是有點難度,不過還是感謝Anpino的幫忙,找了很多資料.把Bingo送給Anpino. 再K了....
系統時間:2024-04-28 15:46:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!