Jose Afonso
Jose Afonso

Reputation: 117

Problem with MediaComposition video rendering

I am trying to generate an MP4 video from a simple MediaComposition, but the generated file is not recognized by any video player application. This is my test code, what could be wrong? Any help is most welcome. Thanks.

private async void nviSave_Tapped(object sender, TappedRoutedEventArgs e)
    {
        MediaComposition mediaComposition;
        var random = new Random();

        var clip1 = MediaClip.CreateFromColor(Colors.AliceBlue, TimeSpan.FromSeconds(90));
        mediaComposition.Clips.Add(clip1);

        for (int i = 0; i < 10; i++)
        {
            var clip2 = MediaClip.CreateFromColor(Color.FromArgb(Convert.ToByte(random.Next(0, 255)),
                Convert.ToByte(random.Next(0, 255)),
                Convert.ToByte(random.Next(0, 255)),
                Convert.ToByte(random.Next(0, 255))),
                TimeSpan.FromSeconds(90));

            mediaOverlayLayer = AddOverlay(mediaComposition, clip2, TimeSpan.FromSeconds(0), 100, 300, 40 + (3 * i), 40, 1);
        }

        mediaComposition.OverlayLayers.Add(mediaOverlayLayer);

        var picker = new Windows.Storage.Pickers.FileSavePicker();
        picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
        picker.FileTypeChoices.Add("MP4 files", new List<string>() { ".mp4" });
        picker.SuggestedFileName = "RenderedComposition.mp4";

        Windows.Storage.StorageFile file = await picker.PickSaveFileAsync();
        if (file != null)
        {
            // Call RenderToFileAsync
            await mediaComposition.RenderToFileAsync(file);

        }
    }

private MediaOverlayLayer AddOverlay(MediaComposition mediaComposition, MediaClip overlayMediaClip, TimeSpan delay, double width, double height, double left, double top, double opacity)
    {
        Rect overlayPosition;

        overlayPosition.Width = width;
        overlayPosition.Height = height;
        overlayPosition.X = left;
        overlayPosition.Y = top;

        MediaOverlay mediaOverlay = new MediaOverlay(overlayMediaClip);
        mediaOverlay.Position = overlayPosition;
        mediaOverlay.Opacity = opacity;
        mediaOverlay.Delay = delay;
        mediaOverlayLayer.Overlays.Add(mediaOverlay);
        return mediaOverlayLayer;
    }

Upvotes: 0

Views: 159

Answers (1)

Nico Zhu
Nico Zhu

Reputation: 32785

I am trying to generate an MP4 video from a simple MediaComposition, but the generated file is not recognized by any video player application.

I tried your code, it looks correct, but you forgot to display the rendering progress, and if the rendering is not complete, the video file will not be recognized. so please add the following code, and play the video after trimmed clip saved

var saveOperation = mediaComposition.RenderToFileAsync(file, MediaTrimmingPreference.Precise);

saveOperation.Progress = new AsyncOperationProgressHandler<TranscodeFailureReason, double>(async (info, progress) =>
{
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
    {
        Debug.WriteLine(string.Format("Saving file... Progress: {0:F0}%", progress));
    }));
});
saveOperation.Completed = new AsyncOperationWithProgressCompletedHandler<TranscodeFailureReason, double>(async (info, status) =>
{
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
    {
        try
        {
            var results = info.GetResults();
            if (results != TranscodeFailureReason.None || status != AsyncStatus.Completed)
            {
                Debug.WriteLine("Saving was unsuccessful");
            }
            else
            {
                Debug.WriteLine("Trimmed clip saved to file");
            }
        }
        finally
        {
            // Update UI whether the operation succeeded or not
        }

    }));
});

And here is official document that you could refer to.

Upvotes: 1

Related Questions