다음을 통해 공유


ASF 데이터 브로드캐스팅

이 항목에서는 HTTP 프로토콜을 사용하여 네트워크를 통해 ASF 데이터를 보내는 방법을 설명합니다. 네트워크를 통해 파일을 보내려면 기록기 개체를 사용해야 하므로 이 항목을 읽기 전에 이 개체를 일반적으로 이해해야 합니다. 자세한 내용은 ASF 파일 작성을 참조하세요.

압축되지 않은 데이터로 시작하는 경우 다음을 수행합니다.

  1. WMCreateWriter 함수를 호출하여 작성기 개체를 만듭니다. 이 함수는 IWMWriter 포인터를 반환합니다.

    IWMWriter *pWriter;
    hr = WMCreateWriter(NULL, &pWriter);
    
  2. IWMWriterNetworkSink 포인터를 반환하는 WMCreateWriterNetworkSink 함수를 호출하여 네트워크 싱크 개체를 만듭니다.

    IWMWriterNetworkSink *pNetSink;
    hr = WMCreateWriterNetworkSink(&pNetSink);
    
  3. 네트워크 싱크에서 IWMWriterNetworkSink::Open 을 호출하고 열 포트 번호를 지정합니다. 예를 들어 8080입니다. 필요에 따라 IWMWriterNetworkSink::GetHostURL 을 호출하여 호스트의 URL을 가져옵니다. 클라이언트는 이 URL의 콘텐츠에 액세스합니다. IWMWriterNetworkSink::SetMaximumClients를 호출하여 클라이언트 수를 제한할 수도 있습니다.

    DWORD dwPortNum = 8080;
    hr = pNetSink->Open( &dwPortNum)
    
  4. 기록기에서 IWMWriterAdvanced::AddSink 를 호출하고 네트워크 싱크의 IWMWriterNetworkSink 인터페이스에 대한 포인터를 사용하여 기록기에 네트워크 싱크를 연결합니다.

    IWMWriterAdvanced *pWriterAdvanced;
    hr = pWriter->QueryInterface(IID_IWMWriterAdvanced, ( void** ) pWriterAdvanced );
    if (SUCCEEDED(hr))
    {
        pWriterAdvanced->AddSink(pNetSink);
    }
    
  5. 작성기 개체에서 IWMProfile 포인터를 사용하여 IWMWriter::SetProfile 메서드를 호출하여 ASF 프로필을 설정합니다. 프로필을 만드는 방법에 대한 자세한 내용은 프로필 작업을 참조하세요.

  6. 필요에 따라 작성기에서 IWMHeaderInfo 인터페이스를 사용하여 메타데이터를 지정합니다.

  7. 기록 기에서 IWMWriter::BeginWriting 을 호출합니다.

    hr = pWriter->BeginWriting();
    
  8. 각 샘플에 대해 IWMWriter::WriteSample 메서드를 호출합니다. 스트림 번호, 프레젠테이션 시간, 샘플 기간 및 샘플 버퍼에 대한 포인터를 지정합니다. WriteSample 메서드는 샘플을 압축합니다.

  9. 완료되면 기록기에서 IWMWriter::EndWriting 을 호출합니다.

    hr = pWriter->EndWriting();
    
  10. 기록 기에서 IWMWriterAdvanced::RemoveSink 를 호출하여 네트워크 싱크 개체를 분리합니다.

    hr = pWriterAdvanced->RemoveSink(pNetSink);
    
  11. 네트워크 싱크에서 IWMWriterNetworkSink::Close 를 호출하여 포트를 해제합니다.

    hr = pNetSink->Close();
    

네트워크를 통해 ASF 콘텐츠를 스트리밍하는 또 다른 방법은 기존 ASF 파일에서 읽는 것입니다. SDK에 제공된 WMVNetWrite 샘플은 이 방법을 보여 줍니다. 이전에 나열된 단계 외에도 다음을 수행합니다.

  1. reader 개체를 만들고 파일 이름으로 Open 메서드를 호출합니다.

  2. 판독기 개체에서 TRUE 값으로 IWMReaderAdvanced::SetManualStreamSelection 을 호출 합니다. 이렇게 하면 애플리케이션이 상호 제외된 스트림을 포함하여 파일의 모든 스트림을 읽을 수 있습니다.

  3. IWMProfile 인터페이스에 대한 판독기를 쿼리합니다. 기록기 개체(이전 절차의 5단계)에서 IWMWriter::SetProfile 을 호출할 때 이 포인터를 사용합니다.

  4. 프로필에 정의된 모든 스트림에 대해 IWMProfile::GetStream 을 호출하여 스트림 번호를 가져옵니다. 이 스트림 번호를 판독기 IWMReaderAdvanced::SetReceiveStreamSamples 메서드에 전달합니다. 이 메서드는 디코딩하지 않고 압축된 샘플을 제공하도록 판독기에게 알릴 수 있습니다. 샘플은 애플리케이션의 IWMReaderCallbackAdvanced::OnStreamSample 콜백 메서드를 통해 애플리케이션에 전달됩니다.

    압축되지 않은 읽은 모든 스트림에 대한 코덱 정보를 가져와서 브로드캐스트하기 전에 헤더에 추가해야 합니다. 코덱 정보를 가져오려면 IWMHeaderInfo2::GetCodecInfoCountIWMHeaderInfo2::GetCodecInfo 를 호출하여 판독기에서 파일과 연결된 코덱을 열거합니다. 스트림 구성과 일치하는 코덱 정보를 선택합니다. 그런 다음 IWMHeaderInfo3::AddCodecInfo를 호출하여 판독기에서 얻은 정보를 전달하여 작성기에서 코덱 정보를 설정합니다.

  5. 작성기에서 프로필을 설정한 후 작성 기에서 IWMWriter::GetInputCount 를 호출하여 입력 수를 가져옵니다. 각 입력에 대해 값이 NULL인 IWMWriter::SetInputProps를 호출합니다. 이는 작성기 개체에 애플리케이션이 압축된 샘플을 제공하므로 작성기가 데이터를 압축하는 데 코덱을 사용할 필요가 없음을 나타냅니다. BeginWriting을 호출하기 전에 SetInputProps를 호출해야 합니다.

  6. 필요에 따라 판독기에서 작성기로 메타데이터 특성을 복사합니다.

  7. 판독기의 샘플은 이미 압축되어 있으므로 WriteSample 메서드 대신 IWMWriterAdvanced::WriteStreamSample 메서드를 사용하여 샘플을 작성합니다. WriteStreamSample 메서드는 기록기 개체의 일반적인 압축 프로시저를 무시합니다.

  8. 판독기가 파일의 끝에 도달하면 애플리케이션에 WMT_EOF 알림을 보냅니다.

또한 애플리케이션은 판독기 개체의 클록을 구동하여 판독기가 파일에서 데이터를 최대한 빨리 끌어올 수 있도록 해야 합니다. 이렇게 하려면 판독기에서 IWMReaderAdvanced::SetUserProvidedClock 메서드를 TRUE 값으로 호출 합니다. 판독기가 WMT_STARTED 알림을 보낸 후 IWMReaderAdvanced::D eliverTime 을 호출하고 판독기가 제공해야 하는 시간 간격을 지정합니다. 판독기가 이 시간 간격을 읽은 후 애플리케이션의 IWMReaderCallbackAdvanced::OnTime 콜백 메서드를 호출합니다. 애플리케이션은 다음 시간 간격을 읽으려면 DeliverTime 을 다시 호출해야 합니다. 예를 들어 파일에서 1초 간격으로 읽으려면 다음을 수행합니다.

// Initial call to DeliverTime.
QWORD m_qwTime = 10000000; // 1 second.
hr = m_pReaderAdvanced->DeliverTime(m_qwTime);

// In the callback:
HRESULT CNetWrite::OnTime(QWORD cnsCurrentTime, void *pvContext)
{
    HRESULT hr = S_OK;
    // Continue calling DeliverTime until the end of the file.
    if(!m_bEOF)
    {
        m_qwTime += 10000000; // 1 second.
        hr = m_pReaderAdvanced->DeliverTime(m_qwTime);
    }
    return S_OK;
}

네트워크를 통해 ASF 데이터 보내기

기록기 싱크 작업