92068


提示コードでは関数 `t()`
でtest.mp4という.hevcファイルをロードしてsample.mp4というファイルで出力しているはずなのですが動画ファイルが生成されません。これはなぜでしょうか？

### 試したこと、確認したこと

  1. test.mp4ですがクリックするとHEVCコーディックですと表示されるのでこのファイルはHEVCファイルです。
  2. ffmpeg.exeが実行ファイルと同じディレクトリにあります。
  3. test.mp4も実行ファイルと同じディレクトリにあります。
  4. Debug.WriteLine();が表示されているため関数の最後まで実行されています。

### 知りたいこと

sample.mp4 ファイルが生成されない原因が知りたい

参考サイト：  
<https://ffmpeg.xabe.net/docs.html>

#### 環境

Windows 10  
Visual Studio 2022  
.Net 6.0

[code]

    using Microsoft.VisualBasic;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Drawing;
    using System.IO;
    using System.Resources;
    using Xabe.FFmpeg;
    
    namespace HEVC_SimpleConverter
    {
        public partial class Form1 : Form
        {
            private async void t()
            {
                string outputPath = "sample.mp4";
                IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo("test.mp4");
    
                IStream videoStream = mediaInfo.VideoStreams.FirstOrDefault()
                    ?.SetCodec(VideoCodec.h264);
                IStream audioStream = mediaInfo.AudioStreams.FirstOrDefault()
                    ?.SetCodec(AudioCodec.aac);
    
                FFmpeg.Conversions.New()
                    .AddStream(audioStream, videoStream)
                    .SetOutput(outputPath)
                    .Start();
            }
    
            public Form1()
            {
                InitializeComponent();
                t();
                Debug.WriteLine("aaaaaa");
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2022-11-07T02:44:12.843
92051
2022-11-07T12:22:31.007
2022-11-07T12:22:31.007
3060
55177
question
c# .net winforms
Xabe.FFmpegで動画ファイルがエンコードされない原因が知りたい


tが非同期メソッドなので、Debug.WriteLineを通過したからといって、tの処理が終わっているとは限らないです。あと、イベントハンドラ以外のasync
voidはやめましょう。

[非同期プログラミングのベスト プラクティス](https://learn.microsoft.com/ja-jp/archive/msdn-
magazine/2013/march/async-await-best-practices-in-asynchronous-programming)


CC BY-SA 4.0
2022-11-07T05:13:11.110
92059
2022-11-07T05:13:11.110
41943
92051
answer


原因はradianさんが答えている通りですが、じゃあどうすればいいかですが、質問に毎回、空のまま載せられている `Form1_Load`メソッドが無難です。

[code]

    async Task t() {
        var outputPath = "sample.mp4";
        var mediaInfo = await FFmpeg.GetMediaInfo("test.mp4");
        var videoStream = mediaInfo.VideoStreams.FirstOrDefault()?.SetCodec(VideoCodec.h264);
        var audioStream = mediaInfo.AudioStreams.FirstOrDefault()?.SetCodec(AudioCodec.aac);
        await FFmpeg.Conversions.New()
            .AddStream(audioStream, videoStream)
            .SetOutput(outputPath)
            .Start();
    }
    
    async void Form1_Load(object sender, EventArgs e) {
        await t();
        Debug.WriteLine("aaaaaa");
    }
    
[/code]


CC BY-SA 4.0
2022-11-07T12:12:41.177
92068
2022-11-07T12:12:41.177
4236
92051
answer