Bagikan melalui


Menambahkan Informasi Aliran ke Sink File ASF

Sink file ASF adalah implementasi dari IMFMediaSink yang disediakan oleh Media Foundation yang dapat digunakan aplikasi untuk mengarsipkan data media ASF ke file. Untuk informasi tentang model objek ASF Media Sink dan penggunaan umum, lihat Sink Media ASF.

Setelah membuat instans sink file, file harus dikonfigurasi sebelum membangun topologi. Sink file perlu mengetahui tentang aliran dalam file output, informasi mode pengodean, dan metadata. Topik ini menjelaskan proses penambahan aliran di sink file.

Menambahkan Stream di Sink File ASF

Sink file harus mengetahui aliran output dan propertinya sehingga dapat menghasilkan sampel output yang sesuai dan menambahkannya ke file ASF output. Pengaturan ini ditulis ke Objek Header ASF akhir.

Untuk mengatur informasi streaming, Anda harus memiliki referensi ke objek ASF ContentInfo sink file. Untuk informasi, lihat Membuat Sink File ASF.

Prosedur berikut ini meringkas langkah-langkah umum untuk mengonfigurasi aliran dengan menggunakan objek profil ASF.

Untuk mengonfigurasi informasi aliran di sink file ASF

  1. Buat objek profil ASF dengan memanggil MFCreateASFProfile.

  2. Untuk setiap aliran dalam file output, buat jenis media untuk aliran target yang akan ditambahkan di sink file. Jenis media harus kompatibel dengan jenis output yang didukung oleh encoder Windows Media.

    Untuk informasi tentang menambahkan aliran audio ke profil, lihat Membuat Aliran Audio untuk Pengodean ASF.

    Untuk informasi tentang menambahkan streaming video ke profil, lihat Membuat Streaming Video untuk Pengodean ASF.

  3. Buat aliran berdasarkan jenis media yang dibuat di langkah 2 dengan memanggil IMFASFProfile::CreateStream.

  4. Tetapkan nomor streaming untuk aliran yang baru dibuat dengan memanggil penunjuk antarmuka IMFASFStreamConfig yang diterima di langkah 3.

  5. Secara opsional mengonfigurasi aliran dengan informasi berikut:

  6. Secara opsional atur ukuran paket data untuk profil dengan mengatur atribut MF_ASFPROFILE_MINPACKETSIZE dan MF_ASFPROFILE_MAXPACKETSIZE . Profil ASF mengekspos antarmuka IMFAttributes , yang dapat dirujuk oleh aplikasi dengan memanggil IMFASFProfile::QueryInterface.

  7. Atur informasi pengodean untuk aliran di sink file. Dibahas dalam Mengatur Properti di Sink File.

  8. Tambahkan aliran ke profil dengan memanggil IMFASFProfile::SetStream.

  9. Kaitkan profil dengan objek ContentInfo dengan memanggil IMFASFContentInfo::SetProfile.

Untuk memodifikasi aliran yang ada, aplikasi bisa mendapatkan referensi ke antarmuka IMFASFStreamConfig aliran dan mengonfigurasi ulang sesuai dengan persyaratan. Untuk menambahkan atau menghapus aliran, aplikasi harus memanggil IMFASFProfile::RemoveStream. Untuk menerapkan perubahan ini, modifikasi atau penghapusan aliran, Anda harus mengatur profil lagi di objek ContentInfo. Ini menimpa profil yang ada yang sudah terkait dengan objek ContentInfo.

//-------------------------------------------------------------------
//  CreateVideoStream
//  Create an video stream and add it to the profile.
//
//  pProfile: A pointer to the ASF profile.
//  wStreamNumber: Stream number to assign for the new stream.
//    pType: A pointer to the source's video media type.
//-------------------------------------------------------------------

HRESULT CreateVideoStream(IMFASFProfile* pProfile, WORD wStreamNumber, IMFMediaType* pType)
{
    if (!pProfile)
    {
        return E_INVALIDARG;
    }
    if (wStreamNumber < 1 || wStreamNumber > 127 )
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }

    HRESULT hr = S_OK;

    
    IMFMediaType* pVideoType = NULL;
    IMFASFStreamConfig* pVideoStream = NULL;

    UINT32 dwBitRate = 0;
        
    //Create a new video type from the source type
    hr = CreateCompressedVideoType(pType, &pVideoType);
    if (FAILED(hr))
    {
        goto done;
    }

    //Create a new stream with the video type
    hr = pProfile->CreateStream(pVideoType, &pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }
    

    //Set a valid stream number
    hr = pVideoStream->SetStreamNumber(wStreamNumber);
    if (FAILED(hr))
    {
        goto done;
    }

    //Add the stream to the profile
    hr = pProfile->SetStream(pVideoStream);
    if (FAILED(hr))
    {
        goto done;
    }

    wprintf_s(L"Video Stream created. Stream Number: %d .\n", wStreamNumber);

done:

    SafeRelease(&pVideoStream);
    SafeRelease(&pVideoType);

    return hr;
}

Menghitung Sink Aliran

Untuk setiap aliran di profil yang diketahui objek ContentInfo, sink file ASF membuat dan menambahkan sink aliran yang berisi semua properti aliran yang dikodekan. Sink file ASF dirancang untuk berisi aliran tetap. Ini berarti Anda tidak dapat menambahkan atau menghapus aliran dengan memanggil IMFMediaSink::AddStreamSink atau IMFMediaSink::RemoveStreamSink. Panggilan pada sink file ini gagal dengan kode kesalahan MF_E_STREAMSINKS_FIXED. Menambahkan atau menghapus aliran di profil tidak secara otomatis menambahkan atau menghapus sink aliran di sink file. Anda harus membuang instans file yang ada dan membuatnya kembali dengan informasi streaming baru jika aliran Anda di profil telah berubah.

Prosedur berikut ini meringkas langkah-langkah umum untuk menghitung sink aliran di sink file ASF.

Untuk menghitung sink aliran

  1. Panggil IMFMediaSink::GetStreamSinkCount untuk mendapatkan jumlah total sink aliran di sink file ASF.

  2. Perulangan melalui stream sink ang mendapatkan referensi ke antarmuka GetStreamSinkByIndex stream sink.

    -atau-

    Panggil IMFMediaSink::GetStreamSinkById untuk mendapatkan sink streaming dengan menentukan nomor aliran. Setiap sink streaming diidentifikasi dengan nomor aliran yang Anda tetapkan saat membuat streaming di profil.

Jika Anda membangun topologi parsial untuk mengodekan file media, Anda harus menambahkan sink file ke topologi sebagai simpul topologi output. Anda dapat melakukannya dengan menentukan setiap sink uap di sink file atau dengan mengatur objek aktivasi sink file dan pengidentifikasi sink aliran. Untuk informasi selengkapnya dan contoh kode, lihat Membuat Simpul Output.

Sink Media ASF

Dukungan ASF di Media Foundation