Language: HTML | XAML

如何修剪視訊檔案 (XAML)

MediaTranscoder 物件可以用來修剪媒體檔案。

在這個範例中,設定了兩個編輯點、一個是起點,另一個是終點。這些編輯點會指定輸出視訊的起點與終點。MediaTranscoder 物件在輸出檔案時會使用和來源檔案一樣的編碼設定檔,但是會在兩個編輯點修剪視訊。

這個 How-to 描述如何使用 FileOpenPicker 類別從系統開啟視訊檔案、使用 MediaTranscoder 類別修剪該檔案,最後使用 FileSavePicker 類別儲存剛才編碼的檔案。

如需在使用 C++、C# 或 Visual Basic 的 Windows 執行階段應用程式中轉碼的另一個範例,請參閱轉碼媒體範例

先決條件

這個主題假設您可以使用 C++、C# 或 Visual Basic 建立基本的 Windows 執行階段應用程式。如果建立您的第一個應用程式時需要協助,請參閱使用 C# 或 Visual Basic 建立您的第一個 Windows 市集應用程式

指示

步驟 1: 建立新專案

從在 Microsoft Visual Studio 中建立空白專案開始。

步驟 2: 選取來源檔案並建立目的地檔案

使用 FileOpenPicker 類別來選取來源檔案,然後使用 FileSavePicker 類別來建立目的地檔案。在 FileOpenPicker 上設定 SuggestedStartLocationFileTypeFilter 屬性。在 FileSavePicker 物件上,設定 SuggestedStartLocationDefaultFileExtensionSuggestedFileNameFileTypeChoices 屬性。請注意,這個方法會呼叫 TrimFile 方法。 這是一個由使用者定義用來執行轉碼作業的方法。 我們會在下一個步驟中建立這個方法。

Windows Phone 市集應用程式必須使用 pickSingleFileAndContinue


async void TrimVideoFile()
{
    Windows.Storage.StorageFile source;
    Windows.Storage.StorageFile destination;

    var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

    openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    openPicker.FileTypeFilter.Add(".wmv");
    openPicker.FileTypeFilter.Add(".mp4");

    source = await openPicker.PickSingleFileAsync();

    var savePicker = new Windows.Storage.Pickers.FileSavePicker();

    savePicker.SuggestedStartLocation =
        Windows.Storage.Pickers.PickerLocationId.VideosLibrary;

    savePicker.DefaultFileExtension = ".mp4";
    savePicker.SuggestedFileName = "New Video";

    savePicker.FileTypeChoices.Add("MPEG4", new string[] { ".mp4" });

    destination = await savePicker.PickSaveFileAsync();

    // Method to perform the transcoding.
    TrimFile(source, destination);
}


步驟 3: 初始化 MediaTranscoder

透過呼叫 MediaEncodingProfile.CreateMp4 建立 MediaEncodingProfile 物件。 接著,建立 MediaTranscoder 物件,並將 TrimStartTime 屬性設定為 1 秒,以及將 TrimStopTime 屬性設定為 9 秒。


MediaEncodingProfile profile =
    MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

MediaTranscoder transcoder = new MediaTranscoder();

// Set the start of the trim.
transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

// Set the end of the trim.
transcoder.TrimStopTime = new TimeSpan(0, 0, 9);


步驟 4: 修剪檔案

若要修剪檔案,請呼叫非同步方法 PrepareFileTranscodeAsync,然後在 PrepareTranscodeResult 物件上呼叫 TranscodeAsync 方法。

請注意,這個範例中的程式碼會呼叫 OutputText 方法。這是一個 Helper 方法,建立的目的是將訊息輸出至 UI。 這個方法的程式碼定義在這個主題的最後。


async void TrimFile(StorageFile srcFile, StorageFile destFile)
{
    MediaEncodingProfile profile =
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

    MediaTranscoder transcoder = new MediaTranscoder();

    // Set the start of the trim.
    transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

    // Set the end of the trim.
    transcoder.TrimStopTime = new TimeSpan(0, 0, 9);

    PrepareTranscodeResult prepareOp = await
        transcoder.PrepareFileTranscodeAsync(srcFile, destFile, profile);

    if (prepareOp.CanTranscode)
    {
        var transcodeOp = prepareOp.TranscodeAsync();
        transcodeOp.Progress +=
            new AsyncActionProgressHandler<double>(TranscodeProgress);
        transcodeOp.Completed +=
            new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
    }
    else
    {
        switch (prepareOp.FailureReason)
        {
            case TranscodeFailureReason.CodecNotFound:
                OutputText("Codec not found.");
                break;
            case TranscodeFailureReason.InvalidProfile:
                OutputText("Invalid profile.");
                break;
            default:
                OutputText("Unknown failure.");
                break;
        }
    }
}


在您修剪媒體檔案時,不需要在 PrepareFileTranscodeAsync 方法中指定編碼設定檔。如果您略過這個設定檔,目的地檔案的格式會和輸入檔案相同。

步驟 5: 將進度輸出至 UI

它可以用來將進度和狀態資訊輸出至使用者介面。


    <StackPanel Background="{StaticResource ApplicationPageBackgroundBrush}">
        <TextBlock Name="txtDisplay" Text="Display"></TextBlock>
        <TextBlock Name="txtProgress" Text="Progress"></TextBlock>
    </StackPanel>



void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
{
    // Display or handle progress info.
}

void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
{
    asyncInfo.GetResults();
    if (asyncInfo.Status == AsyncStatus.Completed)
    {
        // Display or handle complete info.
    }
    else if (asyncInfo.Status == AsyncStatus.Canceled)
    {
        // Display or handle cancel info.
    }
    else
    {
        // Display or handle error info.
    }
}


完整範例

下列程式碼範例顯示修剪作業中呼叫的完整順序。

首先,這裡是負責開啟和儲存檔案的程式碼。


async void TrimVideoFile()
{
    Windows.Storage.StorageFile source;
    Windows.Storage.StorageFile destination;

    var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

    openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    openPicker.FileTypeFilter.Add(".wmv");
    openPicker.FileTypeFilter.Add(".mp4");

    source = await openPicker.PickSingleFileAsync();

    var savePicker = new Windows.Storage.Pickers.FileSavePicker();

    savePicker.SuggestedStartLocation =
        Windows.Storage.Pickers.PickerLocationId.VideosLibrary;

    savePicker.DefaultFileExtension = ".mp4";
    savePicker.SuggestedFileName = "New Video";

    savePicker.FileTypeChoices.Add("MPEG4", new string[] { ".mp4" });

    destination = await savePicker.PickSaveFileAsync();

    // Method to perform the transcoding.
    TrimFile(source, destination);
}


接著,這裡是負責轉碼檔案的程式碼。


async void TrimFile(StorageFile srcFile, StorageFile destFile)
{
    MediaEncodingProfile profile =
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

    MediaTranscoder transcoder = new MediaTranscoder();

    // Set the start of the trim.
    transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

    // Set the end of the trim.
    transcoder.TrimStopTime = new TimeSpan(0, 0, 9);

    PrepareTranscodeResult prepareOp = await
        transcoder.PrepareFileTranscodeAsync(srcFile, destFile, profile);

    if (prepareOp.CanTranscode)
    {
        var transcodeOp = prepareOp.TranscodeAsync();
        transcodeOp.Progress +=
            new AsyncActionProgressHandler<double>(TranscodeProgress);
        transcodeOp.Completed +=
            new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
    }
    else
    {
        switch (prepareOp.FailureReason)
        {
            case TranscodeFailureReason.CodecNotFound:
                OutputText("Codec not found.");
                break;
            case TranscodeFailureReason.InvalidProfile:
                OutputText("Invalid profile.");
                break;
            default:
                OutputText("Unknown failure.");
                break;
        }
    }
}


接下來,這裡是處理轉碼進度、錯誤以及完成的程式碼。


void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
{
    // Display or handle progress info.
}

void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
{
    asyncInfo.GetResults();
    if (asyncInfo.Status == AsyncStatus.Completed)
    {
        // Display or handle complete info.
    }
    else if (asyncInfo.Status == AsyncStatus.Canceled)
    {
        // Display or handle cancel info.
    }
    else
    {
        // Display or handle error info.
    }
}


最後是顯示進度與狀態訊息的 UI 物件。


    <StackPanel Background="{StaticResource ApplicationPageBackgroundBrush}">
        <TextBlock Name="txtDisplay" Text="Display"></TextBlock>
        <TextBlock Name="txtProgress" Text="Progress"></TextBlock>
    </StackPanel>


相關主題

藍圖
使用 C# 和 Visual Basic 建立 Windows 執行階段應用程式的藍圖
使用 C++ 建立 Windows 執行階段應用程式的藍圖
設計應用程式的 UX
新增多媒體
範例
轉碼媒體範例
媒體延伸範例
即時通訊範例
工作
快速入門:視訊檔案轉碼
參考
Windows.Media
Windows.Media.MediaProperties
Windows.Media.Transcoding
MediaTranscoder
PrepareTranscodeResult
TranscodeAsync
其他資源
支援的音訊與視訊格式
最佳化媒體資源

 

 

顯示:
© 2015 Microsoft