Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğretici, sıkıştırılmamış bir ses dosyasından (.wav) medya içeriği ayıklayıp ASF biçiminde sıkıştırarak yeni bir ses dosyası (.wma) yazmayı gösterir. Dönüştürme için kullanılan kodlama modu Sabit Bit Hızı Kodlama (CBR). Bu modda, kodlama oturumundan önce uygulama kodlayıcının başarması gereken bir hedef bit hızı belirtir.
Bu öğreticide, girdi ve çıkış dosya adlarını bağımsız değişken olarak alan bir konsol uygulaması oluşturacaksınız. Uygulama, bu öğreticiyle birlikte sağlanan bir dalga dosyası ayrıştırma uygulamasından sıkıştırılmamış medya örneklerini alır. Bu örnekler, Windows Media Audio 9 biçimine dönüştürülmek üzere kodlayıcıya gönderilir. Kodlayıcı CBR kodlaması için yapılandırılır ve hedef bit hızı olarak medya türü anlaşması sırasında kullanılabilen ilk bit hızını kullanır. Kodlanmış örnekler ASF veri biçiminde paketleştirme için çoğullayıcıya gönderilir. Bu paketler ASF Veri Nesnesi'ni temsil eden bir bayt akışına yazılır. Veri bölümü hazır olduktan sonra bir ASF ses dosyası oluşturacak ve tüm üst bilgi bilgilerini bir araya getiren yeni ASF Üst Bilgi Nesnesi'ni yazacak ve ardından ASF Veri Nesnesi bayt akışını ekleyebilirsiniz.
Bu öğretici aşağıdaki bölümleri içerir:
- Önkoşullar
- Terminoloji
- 1. Proje Kurulumu
- 2. Yardımcı İşlevleri bildirme
- 3. Ses Dosyası açma
- 4. Kodlayıcı yapılandırma
- 5. ASF ContentInfo nesnesini oluşturun.
- 6. ASF Multiplexer oluştur
- 7. Yeni ASF Veri Paketleri Oluşturma
- 8. ASF Dosyasını Yaz
- 9. Entry-Point İşlevini tanımlama
- İlgili konular
Önkoşullar
Bu öğreticide aşağıdakiler varsayılır:
- ASF dosyasının yapısı ve Media Foundation tarafından ASF Nesneleri ile çalışmak için sağlanan bileşenler hakkında bilgi sahibisiniz. Bu bileşenler ContentInfo, bölücü, çoğullayıcı ve profil nesnelerini içerir. Daha fazla bilgi için bkz. WMContainer ASF Components.
- Windows Media kodlayıcıları ve özellikle CBR olmak üzere çeşitli kodlama türlerini biliyorsunuz. Daha fazla bilgi için bkz. Windows Media Kodlayıcıları.
- Medya Arabellekleri ve bayt akışları hakkında bilgi sahibisiniz: Özellikle bayt akışı kullanan dosya işlemleri ve bir medya arabelleğinin içeriğini bayt akışına yazma.
Terminoloji
Bu öğreticide aşağıdaki terimler kullanılır:
- Kaynak medya türü: Medya türü nesnesi, giriş dosyasının içeriğini açıklayan IMFMediaType arabirimini kullanıma sunar.
- Ses profili: Profil nesnesi, çıkış dosyasının yalnızca ses akışlarını içeren IMFASFProfile arabirimini kullanıma sunar.
- Akış örneği: Medya örneği, IMFSample arabirimini açığa çıkarır, sıkıştırılmış durumda kodlayıcıdan alınan giriş dosyasının medya verilerini temsil eder.
- ContentInfo nesnesi: ASF ContentInfo Nesnesi, çıkış dosyasının ASF Üst Bilgi Nesnesi'ni temsil eden IMFASFContentInfo arabirimini kullanıma sunar.
- Veri bayt akışı: Bayt akışı nesnesi, çıkış dosyasının ASF Veri Nesnesi bölümünün tamamını temsil eden IMFByteStream arabirimini kullanıma sunar.
- Veri paketi: Medya örneği, ASF Multiplexertarafından oluşturulan IMFSample arabirimini kullanıma sunar; , veri bayt akışına yazılacak bir ASF veri paketini temsil eder.
- Çıkış bayt akışı: Bayt akışı nesnesi, çıkış dosyasının içeriğini içeren IMFByteStream arabirimini kullanıma sunar.
1. Projeyi Ayarlama
Kaynak dosyanıza aşağıdaki üst bilgileri ekleyin:
#include <new> #include <stdio.h> // Standard I/O #include <windows.h> // Windows headers #include <mfapi.h> // Media Foundation platform #include <wmcontainer.h> // ASF interfaces #include <mferror.h> // Media Foundation error codes
Aşağıdaki kitaplık dosyalarına bağlantı:
- mfplat.lib
- mf.lib
- mfuuid.lib
SafeRelease işlevini bildirin.
Projenize CWmaEncoder sınıfını ekleyin. Bu sınıfın tam kaynak kodu için bkz. Kodlayıcı Örnek Kodu.
2. Yardımcı İşlevleri Bildirme
Bu öğreticide, bir bayt akışından okumak ve yazmak için aşağıdaki yardımcı işlevler kullanılır.
-
AppendToByteStream
: Bir bayt akışının içeriğini başka bir bayt akışına ekler. - WriteBufferToByteStream: Medya arabelleğindeki verileri bayt akışına aktarır.
Daha fazla bilgi için bkz. IMFByteStream::Write. Aşağıdaki kod şu yardımcı işlevleri gösterir:
//-------------------------------------------------------------------
// AppendToByteStream
//
// Reads the contents of pSrc and writes them to pDest.
//-------------------------------------------------------------------
HRESULT AppendToByteStream(IMFByteStream *pSrc, IMFByteStream *pDest)
{
HRESULT hr = S_OK;
const DWORD READ_SIZE = 1024;
BYTE buffer[READ_SIZE];
while (1)
{
ULONG cbRead;
hr = pSrc->Read(buffer, READ_SIZE, &cbRead);
if (FAILED(hr)) { break; }
if (cbRead == 0)
{
break;
}
hr = pDest->Write(buffer, cbRead, &cbRead);
if (FAILED(hr)) { break; }
}
return hr;
}
//-------------------------------------------------------------------
// WriteBufferToByteStream
//
// Writes data from a media buffer to a byte stream.
//-------------------------------------------------------------------
HRESULT WriteBufferToByteStream(
IMFByteStream *pStream, // Pointer to the byte stream.
IMFMediaBuffer *pBuffer, // Pointer to the media buffer.
DWORD *pcbWritten // Receives the number of bytes written.
)
{
HRESULT hr = S_OK;
DWORD cbData = 0;
DWORD cbWritten = 0;
BYTE *pMem = NULL;
hr = pBuffer->Lock(&pMem, NULL, &cbData);
if (SUCCEEDED(hr))
{
hr = pStream->Write(pMem, cbData, &cbWritten);
}
if (SUCCEEDED(hr))
{
if (pcbWritten)
{
*pcbWritten = cbWritten;
}
}
if (pMem)
{
pBuffer->Unlock();
}
return hr;
}
3. Ses Dosyası Açma
Bu öğreticide, uygulamanızın kodlama için sıkıştırılmamış ses oluşturacağı varsayılır. Bu amaçla, bu öğreticide iki işlev bildirilir:
HRESULT OpenAudioFile(PCWSTR pszURL, IMFMediaType **ppAudioFormat);
HRESULT GetNextAudioSample(BOOL *pbEOS, IMFSample **ppSample);
Bu işlevlerin uygulanması okuyucuya bırakılır.
-
OpenAudioFile
işlevi, pszURL tarafından belirtilen medya dosyasını açmalı ve ses akışını açıklayan bir medya türüne işaretçi döndürmelidir. -
GetNextAudioSample
işlevi,OpenAudioFile
tarafından açılan dosyadan sıkıştırılmamış PCM sesini okumalıdır. Dosyanın sonuna ulaşıldığında pbEOSTRUEdeğerini alır. Aksi takdirde, ppSample ses arabelleğini içeren bir medya örneği alır.
4. Kodlayıcıyı yapılandırma
Ardından kodlayıcıyı oluşturun, CBR ile kodlanmış akış örnekleri üretecek şekilde yapılandırın ve giriş ile çıkış medya türleri arasında anlaşma yapın.
Media Foundation'da kodlayıcılar (IMFTransform arabirimini kullanıma sunar) Media Foundation Dönüşümleri (MFT) olarak uygulanır.
Bu öğreticide, MFT için bir sarmalayıcı sağlayan CWmaEncoder
sınıfında kodlayıcı uygulanmaktadır. Bu sınıfın tam kaynak kodu için bkz. Kodlayıcı Örnek Kodu.
Not
İsteğe bağlı olarak kodlama türünü CBR olarak belirtebilirsiniz. Kodlayıcı varsayılan olarak CBR kodlamasını kullanacak şekilde yapılandırılır. Daha fazla bilgi için bkz. sabit bit hızı kodlama . Kodlama türüne bağlı olarak ek özellikler ayarlayabilirsiniz. Kodlama moduna özgü özellikler hakkında bilgi için bkz. Quality-Based Değişken Bit Hızı Kodlama, Kısıtlanmamış Değişken Bit Hızı Kodlamave Peak-Constrained Değişken Bit Hızı Kodlama.
CWmaEncoder* pEncoder = NULL; //Pointer to the Encoder object.
hr = OpenAudioFile(sInputFileName, &pInputType);
if (FAILED(hr))
{
goto done;
}
// Initialize the WMA encoder wrapper.
pEncoder = new (std::nothrow) CWmaEncoder();
if (pEncoder == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
hr = pEncoder->Initialize();
if (FAILED(hr))
{
goto done;
}
hr = pEncoder->SetEncodingType(EncodeMode_CBR);
if (FAILED(hr))
{
goto done;
}
hr = pEncoder->SetInputType(pInputType);
if (FAILED(hr))
{
goto done;
}
5. ASF ContentInfo nesnesini oluşturun.
ASF ContentInfo Nesnesi, çıkış dosyasının çeşitli üst bilgi nesneleri hakkında bilgi içerir.
İlk olarak, ses akışı için bir ASF profili oluşturun:
- Boş bir ASF profil nesnesi oluşturmak için MFCreateASFProfileçağrısı yapın. ASF profili, IMFASFProfile arayüzünü kullanıma sunar. Daha fazla bilgi için bkz. ASF Akışlarını Oluşturma ve Yapılandırma.
- kodlanmış ses biçimini
CWmaEncoder
nesnesinden alın. - ASF profili için yeni bir akış oluşturmak için IMFASFProfile::CreateStream çağrısı yapın. akış biçimini temsil eden IMFMediaType arabirimine bir işaretçi geçirin.
- Bir akış tanımlayıcısı atamak için IMFASFStreamConfig::SetStreamNumber çağırın.
- Akış nesnesinde MF_ASFSTREAMCONFIG_LEAKYBUCKET1 özniteliğini ayarlayarak "sızdıran demet" parametrelerini ayarlayın.
- Yeni akışı profile eklemek için IMFASFProfile::SetStream çağrısını yapın.
Şimdi ASF ContentInfo nesnesini aşağıdaki gibi oluşturun:
- Boş bir ContentInfo nesnesi oluşturmak için MFCreateASFContentInfoçağrısı yapın.
- ASF profilini ayarlamak için IMFASFContentInfo::SetProfile çağırın.
Aşağıdaki kod şu adımları gösterir:
HRESULT CreateASFContentInfo(
CWmaEncoder* pEncoder,
IMFASFContentInfo** ppContentInfo
)
{
HRESULT hr = S_OK;
IMFASFProfile* pProfile = NULL;
IMFMediaType* pMediaType = NULL;
IMFASFStreamConfig* pStream = NULL;
IMFASFContentInfo* pContentInfo = NULL;
// Create the ASF profile object.
hr = MFCreateASFProfile(&pProfile);
if (FAILED(hr))
{
goto done;
}
// Create a stream description for the encoded audio.
hr = pEncoder->GetOutputType(&pMediaType);
if (FAILED(hr))
{
goto done;
}
hr = pProfile->CreateStream(pMediaType, &pStream);
if (FAILED(hr))
{
goto done;
}
hr = pStream->SetStreamNumber(DEFAULT_STREAM_NUMBER);
if (FAILED(hr))
{
goto done;
}
// Set "leaky bucket" values.
LeakyBucket bucket;
hr = pEncoder->GetLeakyBucket1(&bucket);
if (FAILED(hr))
{
goto done;
}
hr = pStream->SetBlob(
MF_ASFSTREAMCONFIG_LEAKYBUCKET1,
(UINT8*)&bucket,
sizeof(bucket)
);
if (FAILED(hr))
{
goto done;
}
//Add the stream to the profile
hr = pProfile->SetStream(pStream);
if (FAILED(hr))
{
goto done;
}
// Create the ASF ContentInfo object.
hr = MFCreateASFContentInfo(&pContentInfo);
if (FAILED(hr))
{
goto done;
}
hr = pContentInfo->SetProfile(pProfile);
if (FAILED(hr))
{
goto done;
}
// Return the pointer to the caller.
*ppContentInfo = pContentInfo;
(*ppContentInfo)->AddRef();
done:
SafeRelease(&pProfile);
SafeRelease(&pStream);
SafeRelease(&pMediaType);
SafeRelease(&pContentInfo);
return hr;
}
6. ASF Multiplexer'ını oluşturma
ASF Multiplexer ASF veri paketleri oluşturur.
- ASF çoklayıcısını oluşturmak için MFCreateASFMultiplexerçağırın.
- Çoklayıcıyı başlatmak için IMFASFMultiplexer::Initialize çağrısı. Önceki bölümde oluşturulan ASF İçerik Bilgileri nesnesine bir işaretçi geçirin.
- MFASF_MULTIPLEXER_AUTOADJUST_BITRATE bayrağını ayarlamak için IMFASFMultiplexer::SetFlags çağırın. Bu ayar kullanıldığında, çoğullayıcı ASF içeriğinin bit hızını, çoğullanan akışların özellikleriyle eşleşecek şekilde otomatik olarak ayarlar.
HRESULT CreateASFMux(
IMFASFContentInfo* pContentInfo,
IMFASFMultiplexer** ppMultiplexer
)
{
HRESULT hr = S_OK;
IMFMediaType* pMediaType = NULL;
IMFASFMultiplexer *pMultiplexer = NULL;
// Create and initialize the ASF Multiplexer object.
hr = MFCreateASFMultiplexer(&pMultiplexer);
if (FAILED(hr))
{
goto done;
}
hr = pMultiplexer->Initialize(pContentInfo);
if (FAILED(hr))
{
goto done;
}
// Enable automatic bit-rate adjustment.
hr = pMultiplexer->SetFlags(MFASF_MULTIPLEXER_AUTOADJUST_BITRATE);
if (FAILED(hr))
{
goto done;
}
*ppMultiplexer = pMultiplexer;
(*ppMultiplexer)->AddRef();
done:
SafeRelease(&pMultiplexer);
return hr;
}
7. Yeni ASF Veri Paketleri Oluşturma
Ardından, yeni dosya için ASF veri paketleri oluşturun. Bu veri paketleri, yeni dosya için son ASF Veri Nesnesini oluşturur. Yeni ASF veri paketleri oluşturmak için:
- ASF veri paketlerini barındıracak geçici bir bayt akışı oluşturmak için MFCreateTempFileçağırın.
- Kodlayıcının sıkıştırılmamış ses verilerini almak için uygulama tanımlı
GetNextAudioSample
işlevini çağırın. - Sıkıştırılmamış sesi sıkıştırma için kodlayıcıya geçirin. Daha fazla bilgi için bkz. Kodlayıcıda Verileri İşleme
- Sıkıştırılmış ses örneklerini paketleştirme için ASF katlayıcıya göndermek için IMFASFMultiplexer::P rocessSampleçağrısı yapın.
- AsF paketlerini multiplexer'dan alın ve geçici bayt akışına yazın. Daha fazla bilgi için bkz. Yeni ASF Veri Paketleri Oluşturma.
- Kaynak akışın sonuna ulaştığınızda kodlayıcıyı boşaltın ve kalan sıkıştırılmış örnekleri kodlayıcıdan çekin. MFT boşaltma hakkında daha fazla bilgi için bkz. Temel MFT İşleme Modeli.
- Tüm örnekler multiplexer'a gönderildikten sonra IMFASFMultiplexer::Flush çağırın ve kalan ASF paketlerini çoklayıcıdan çekin.
- Çağrı IMFASFMultiplexer::End.
Aşağıdaki kod ASF veri paketleri oluşturur. İşlev, ASF Veri Nesnesi'ni içeren bir bayt akışına işaretçi döndürür.
HRESULT EncodeData(
CWmaEncoder* pEncoder,
IMFASFContentInfo* pContentInfo,
IMFASFMultiplexer* pMux,
IMFByteStream** ppDataStream)
{
HRESULT hr = S_OK;
IMFByteStream* pStream = NULL;
IMFSample* pInputSample = NULL;
IMFSample* pWmaSample = NULL;
BOOL bEOF = FALSE;
// Create a temporary file to hold the data stream.
hr = MFCreateTempFile(
MF_ACCESSMODE_READWRITE,
MF_OPENMODE_DELETE_IF_EXIST,
MF_FILEFLAGS_NONE,
&pStream
);
if (FAILED(hr))
{
goto done;
}
BOOL bNeedInput = TRUE;
while (TRUE)
{
if (bNeedInput)
{
hr = GetNextAudioSample(&bEOF, &pInputSample);
if (FAILED(hr))
{
goto done;
}
if (bEOF)
{
// Reached the end of the input file.
break;
}
// Encode the uncompressed audio sample.
hr = pEncoder->ProcessInput(pInputSample);
if (FAILED(hr))
{
goto done;
}
bNeedInput = FALSE;
}
if (bNeedInput == FALSE)
{
// Get data from the encoder.
hr = pEncoder->ProcessOutput(&pWmaSample);
if (FAILED(hr))
{
goto done;
}
// pWmaSample can be NULL if the encoder needs more input.
if (pWmaSample)
{
hr = pMux->ProcessSample(DEFAULT_STREAM_NUMBER, pWmaSample, 0);
if (FAILED(hr))
{
goto done;
}
//Collect the data packets and write them to a stream
hr = GenerateASFDataPackets(pMux, pStream);
if (FAILED(hr))
{
goto done;
}
}
else
{
bNeedInput = TRUE;
}
}
SafeRelease(&pInputSample);
SafeRelease(&pWmaSample);
}
// Drain the MFT and pull any remaining samples from the encoder.
hr = pEncoder->Drain();
if (FAILED(hr))
{
goto done;
}
while (TRUE)
{
hr = pEncoder->ProcessOutput(&pWmaSample);
if (FAILED(hr))
{
goto done;
}
if (pWmaSample == NULL)
{
break;
}
hr = pMux->ProcessSample(DEFAULT_STREAM_NUMBER, pWmaSample, 0);
if (FAILED(hr))
{
goto done;
}
//Collect the data packets and write them to a stream
hr = GenerateASFDataPackets(pMux, pStream);
if (FAILED(hr))
{
goto done;
}
SafeRelease(&pWmaSample);
}
// Flush the mux and get any pending ASF data packets.
hr = pMux->Flush();
if (FAILED(hr))
{
goto done;
}
hr = GenerateASFDataPackets(pMux, pStream);
if (FAILED(hr))
{
goto done;
}
// Update the ContentInfo object
hr = pMux->End(pContentInfo);
if (FAILED(hr))
{
goto done;
}
//Return stream to the caller that contains the ASF encoded data.
*ppDataStream = pStream;
(*ppDataStream)->AddRef();
done:
SafeRelease(&pStream);
SafeRelease(&pInputSample);
SafeRelease(&pWmaSample);
return hr;
}
GenerateASFDataPackets
işlevinin kodu, Yeni ASF Veri Paketleri Oluşturmakonusunda gösterilmiştir.
8. ASF Dosyasını Yazma
Ardından, IMFASFContentInfo::GenerateHeaderçağırarak ASF üst bilgisini bir medya arabelleğine yazın. Bu yöntem, ContentInfo nesnesinde depolanan verileri ASF Üst Bilgi Nesnesi biçiminde ikili verilere dönüştürür. Daha fazla bilgi için bkz. Yeni ASF Üst Bilgi Nesnesi Oluşturma.
Yeni ASF Üst Bilgi Nesnesi oluşturulduktan sonra çıkış dosyası için bir bayt akışı oluşturun. İlk olarak Üst Bilgi Nesnesi'ni çıkış bayt akışına yazın. Veri bayt akışında bulunan Veri Nesnesi ile Üst Bilgi Nesnesi'ni izleyin.
HRESULT WriteASFFile(
IMFASFContentInfo *pContentInfo,
IMFByteStream *pDataStream,
PCWSTR pszFile
)
{
HRESULT hr = S_OK;
IMFMediaBuffer* pHeaderBuffer = NULL;
IMFByteStream* pWmaStream = NULL;
DWORD cbHeaderSize = 0;
DWORD cbWritten = 0;
//Create output file
hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_DELETE_IF_EXIST,
MF_FILEFLAGS_NONE, pszFile, &pWmaStream);
if (FAILED(hr))
{
goto done;
}
// Get the size of the ASF Header Object.
hr = pContentInfo->GenerateHeader (NULL, &cbHeaderSize);
if (FAILED(hr))
{
goto done;
}
// Create a media buffer.
hr = MFCreateMemoryBuffer(cbHeaderSize, &pHeaderBuffer);
if (FAILED(hr))
{
goto done;
}
// Populate the media buffer with the ASF Header Object.
hr = pContentInfo->GenerateHeader(pHeaderBuffer, &cbHeaderSize);
if (FAILED(hr))
{
goto done;
}
// Write the ASF header to the output file.
hr = WriteBufferToByteStream(pWmaStream, pHeaderBuffer, &cbWritten);
if (FAILED(hr))
{
goto done;
}
// Append the data stream to the file.
hr = pDataStream->SetCurrentPosition(0);
if (FAILED(hr))
{
goto done;
}
hr = AppendToByteStream(pDataStream, pWmaStream);
done:
SafeRelease(&pHeaderBuffer);
SafeRelease(&pWmaStream);
return hr;
}
9. Entry-Point İşlevini Tanımlama
Artık önceki adımları eksiksiz bir uygulamada bir araya getirebilirsiniz. Media Foundation nesnelerinden herhangi birini kullanmadan önce, MFStartupçağırarak Media Foundation platformunu başlatın. İşiniz bittiğinde MFShutdownçağrısı yapın. Daha fazla bilgi için bkz. Media Foundation Başlatma.
Aşağıdaki kod, konsol uygulamasının tamamını gösterir. Dönüştürülecek dosyanın ve yeni ses dosyasının adını belirtmek için komut satırı argümanı kullanılır.
int wmain(int argc, WCHAR* argv[])
{
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
if (argc != 3)
{
wprintf_s(L"Usage: %s input.wmv, %s output.wma");
return 0;
}
const WCHAR* sInputFileName = argv[1]; // Source file name
const WCHAR* sOutputFileName = argv[2]; // Output file name
IMFMediaType* pInputType = NULL;
IMFASFContentInfo* pContentInfo = NULL;
IMFASFMultiplexer* pMux = NULL;
IMFByteStream* pDataStream = NULL;
CWmaEncoder* pEncoder = NULL; //Pointer to the Encoder object.
HRESULT hr = CoInitializeEx(
NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr))
{
goto done;
}
hr = MFStartup(MF_VERSION);
if (FAILED(hr))
{
goto done;
}
CWmaEncoder* pEncoder = NULL; //Pointer to the Encoder object.
hr = OpenAudioFile(sInputFileName, &pInputType);
if (FAILED(hr))
{
goto done;
}
// Initialize the WMA encoder wrapper.
pEncoder = new (std::nothrow) CWmaEncoder();
if (pEncoder == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
hr = pEncoder->Initialize();
if (FAILED(hr))
{
goto done;
}
hr = pEncoder->SetEncodingType(EncodeMode_CBR);
if (FAILED(hr))
{
goto done;
}
hr = pEncoder->SetInputType(pInputType);
if (FAILED(hr))
{
goto done;
}
// Create the WMContainer objects.
hr = CreateASFContentInfo(pEncoder, &pContentInfo);
if (FAILED(hr))
{
goto done;
}
hr = CreateASFMux(pContentInfo, &pMux);
if (FAILED(hr))
{
goto done;
}
// Convert uncompressed data to ASF format.
hr = EncodeData(pEncoder, pContentInfo, pMux, &pDataStream);
if (FAILED(hr))
{
goto done;
}
// Write the ASF objects to the output file.
hr = WriteASFFile(pContentInfo, pDataStream, sOutputFileName);
done:
SafeRelease(&pInputType);
SafeRelease(&pContentInfo);
SafeRelease(&pMux);
SafeRelease(&pDataStream);
delete pEncoder;
MFShutdown();
CoUninitialize();
if (FAILED(hr))
{
wprintf_s(L"Error: 0x%X\n", hr);
}
return 0;
}
İlgili konular
-
Media Foundation 'da ASF Desteği