程式者的胡言亂語
ffqlay API說明
ffqlay以C函式的方式提供一組API,為多媒體檔案的撥放提供支援,在本文中則說明這組API中的函式,以及其作用。
首先是FFQLAY_start(),其原型宣告為:
int FFQLAY_start(int argc, char
**argv, HWND hwndParent, int width, int height);
FFQLAY_start的用途在於啟始多媒體檔案的撥放動作。引數argc以及argv是原ffplay程式中main()自命令引接收的引數,ffplay的使用者可以透過命令列引數設定ffplay選項。在這個最初始的版本中,為了簡化起見,先不更動控制ffplay引數的方式,因此保有原有int argc, char **argv的型式,在日後的階段,將會設計API來支援選項的設定。最簡單的情況,你只需要指定argc為2,而argv[0]為任意名稱,argv[1]為欲撥放的檔案路徑即可。
如果你希望ffqlay的撥放畫面被放置到某視窗下,也就是說讓該視窗成為ffqlay撥放畫面的父視窗時,你可以指定hwndParent為該父視窗的window handle。倘若你沒有這樣的需求,將它指定為NULL即可。
此外,你可以透過width及height引數指定所欲撥放視窗的寬及高,在撥放時會依據你所指定的寬高來呈現影像。
FFQLAY_start在執行之後,會啟動一個執行緒來執行其內部的event_loop(),也就是ffplay原先用來處理各種撥放事件的函式(不過這個函式已經被ffqlay大幅的縮減,日後說明ffqlay的修改時會再說明),因此它並不會遲滯呼叫者所在的執行緒,在啟動撥放動作之後,FFQLAY_start便會返回。
那麼,應用程式要如何知道ffqlay已經撥放完畢呢?讓我們來看看下一個函式:
int
FFQLAY_get_play_state(void);
它有可能回傳(參見ffqlay.h)以下的回傳值:
FFQLAY_PLAY_STATE_PLAYING(1):撥放中
FFQLAY_PLAY_STATE_PAUSED(2):暫停
FFQLAY_PLAY_STATE_ABORT(3):放棄
FFQLAY_PLAY_STATE_STOPPED(4):停止
應用程式可以透過呼叫FFQLAY_get_play_state()來取得目前的狀態。目前ffqlay尚不支援事件的主動通知,所以應用程式無法透過設置callback函式之類的方式來接收撥放狀態的改變。
接著,正如撥放狀態中所展示的,你可以在你的應用程式中暫停或停止撥放的動作,只需分別呼叫:
int FFQLAY_pause(void);
int FFQLAY_stop(void);
你可以透過
double
FFQLAY_get_duration(void);
來取得檔案的撥放長度,回傳的double值其單位為秒。
你可以透過
double
FFQLAY_get_position(void);
來取得檔案目前已撥放的進度,回傳的double值單位同樣是秒。
另一方面,呼叫
int FFQLAY_set_position(double
position);
可以設定撥放位置,單位同樣是秒,這個函式可用來實作撥放時的seek功能。
最後,如果你在撥放的過程中想要變更撥放視窗的大小尺寸,可以使用
int FFQLAY_resize(int width,
int height);
分別傳入欲變更的寬及高,即可達成你的目的。
目前提供的函式就是這麼簡單。在ffqlayDemo專案中展示了如何利用這少數幾個函式即可完成一個典型的多媒體檔案撥放器(當然,GUI極其原始)。
另外,ffqlayDemo中的FFQlay.cs展示了如何在C#中使用ffqlay。它利用System.Runtime.InteropServices中的DllImport,能輕易的在managed的.Net程式中使用unmanaged的Windows DLL函式。所有ffqlay中的C函式,在FFQlay這個C#類別中都有相對應的函式。對於C#程式員來說,如果你不熟悉DllImport,你會發現FFQLAY_start的宣告方式有點意思:
public static extern int
FFQLAY_start(int argc, [MarshalAs(UnmanagedType.LPArray,
ArraySubType=UnmanagedType.LPStr)] IntPtr[] argv, IntPtr hwndParent, int width,
int height);
public static void
FFQLAY_start(string fileName, IntPtr hwndParent, int width, int height)
{
IntPtr[] argv = new IntPtr[2];
argv[0] =
Marshal.StringToHGlobalAnsi("ffqlay.exe");
argv[1] = Marshal.StringToHGlobalAnsi(fileName);
FFQLAY_start(2, argv, hwndParent, width, height);
Marshal.FreeHGlobal(argv[0]);
Marshal.FreeHGlobal(argv[1]);
}
它展示了如何建立char **argv以傳入C函式,並且處理字元集的問題。我對.Net並不熟悉,這是我目前所能找到的最好方法。:)
以上,簡單的說明ffqlay所提供的撥放API。
Posted at 11:09下午 八月 22, 2008 by Chien-Hsing Wang in General | 迴響[0]
星期五 八月 22, 2008
