FPCSetGlobalOnLoadExternalResourceHandler

Syntax

typedef HRESULT (WINAPI *PLOADEXTERNALRESOURCEHANDLER)(LPCSTR lpszURL, IStream** ppStream);
void WINAPI FPCSetGlobalOnLoadExternalResourceHandler(PLOADEXTERNALRESOURCEHANDLER pHandler);

Description

The FPCSetGlobalOnLoadExternalResourceHandler function registers a global callback to intercept and provide the content of external resources that Flash movies attempt to load. This allows you to serve media such as Flash Video (FLV), images, or XML data directly from memory without relying on files on disk.

A common use case is streaming FLV files from application resources.

When Flash tries to load an external resource, the handler is called with the requested URL and an output stream pointer. You can then provide the data from memory or resources.

var netConn:NetConnection = new NetConnection();
netConn.connect(null);
 
var netStream:NetStream = new NetStream(netConn);
my_video.attachVideo(netStream);
netStream.setBufferTime(0);
netStream.play("http://FLV/FlashVideo.flv");
HRESULT WINAPI GlobalOnLoadExternalResourceHandler(LPCSTR lpszURL, IStream** ppStream);
 
...
 
FPCSetGlobalOnLoadExternalResourceHandler(&GlobalOnLoadExternalResourceHandler);
 
...
 
HRESULT WINAPI GlobalOnLoadExternalResourceHandler(LPCSTR lpszURL, IStream** ppStream)
{
   HRESULT hr = E_FAIL;
 
   if (0 == lstrcmpiA(lpszURL, "http://FLV/FlashVideo.flv"))
   {
      // Create memory stream
      IStream* pMemStream = NULL;
      CreateStreamOnHGlobal(NULL, TRUE, &pMemStream);
 
      // Load Flash video from resources
      HMODULE hModule = GetModuleHandle(NULL);
      HRSRC hResInfo = FindResource(hModule, _T("EMBEDDED_FLV"), _T("FLV"));
      HGLOBAL hResData = LoadResource(hModule, hResInfo);
      LPCVOID lpData = LockResource(hResData);
      DWORD dwSize = SizeofResource(hModule, hResInfo);
 
      ULONG nWritten;
      pMemStream->Write(lpData, dwSize, &nWritten);
 
      // Reset stream position to beginning
      LARGE_INTEGER liZero = { 0 };
      ULARGE_INTEGER ulNewPosition;
      pMemStream->Seek(liZero, STREAM_SEEK_SET, &ulNewPosition);
 
      *ppStream = pMemStream;
      hr = S_OK;
   }
 
   return hr;
}