如何播放文件剪辑

[与本页关联的功能 MFPlay 是一项旧版功能。 它已被 MediaPlayerIMFMediaEngine 取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngine,而不是 DirectShow。 如果可能,Microsoft 建议应重写使用旧 API 的现有代码,以尽可能地使用新的 API。]

本主题介绍如何通过设置播放的开始时间和停止时间,在 MFPlay 中播放媒体文件的片段。

播放文件剪辑

  1. 调用 IMFPMediaPlayer::CreateMediaItemFromURLIMFPMediaPlayer::CreateMediaItemFromObject 为文件创建媒体项。
  2. (可选)获取文件的总持续时间,如如何获取播放持续时间中所述。
  3. 调用 IMFPMediaItem::SetStartStopPosition 以设置开始时间和停止时间。 停止时间不得超过文件持续时间。
  4. 调用 IMFPMediaPlayer::SetMediaItem 以开始播放。

以下示例使用 CreateMediaItemFromURL 的阻止版本。 如果使用非阻止版本,则应将 CreateMediaItemFromURL 之后显示的代码放置在 MFP_EVENT_TYPE_MEDIAITEM_CREATED 事件的处理程序中。 有关 MFPlay 中事件的详细信息,请参阅从播放器接收事件

此示例通过调用如何获取播放持续时间主题中显示的 GetPlaybackDuration 函数来获取文件持续时间。

HRESULT PlayMediaClip(
    IMFPMediaPlayer *pPlayer,
    PCWSTR pszURL,
    LONGLONG    hnsStart,
    LONGLONG    hnsEnd
    )
{
    IMFPMediaItem *pItem = NULL;
    PROPVARIANT varStart, varEnd;

    ULONGLONG hnsDuration = 0;

    HRESULT hr = pPlayer->CreateMediaItemFromURL(pszURL, TRUE, 0, &pItem);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = GetPlaybackDuration(pItem, &hnsDuration);
    if (FAILED(hr))
    {
        goto done;
    }

    if ((ULONGLONG)hnsEnd > hnsDuration)
    {
        hnsEnd = hnsDuration;
    }

    hr = InitPropVariantFromInt64(hnsStart, &varStart);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = InitPropVariantFromInt64(hnsEnd, &varEnd);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pItem->SetStartStopPosition(
        &MFP_POSITIONTYPE_100NS,
        &varStart,
        &MFP_POSITIONTYPE_100NS,
        &varEnd
        );
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pPlayer->SetMediaItem(pItem);

done:
    SafeRelease(&pItem);
    return hr;
}

要求

MFPlay 需要 Windows 7。

对音频/视频播放使用 MFPlay