FFmpegでYouTube向けにエンコード

FFmpegでYouTube向けにエンコードしたい場合は

$ ffmpeg -i input.avi -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p output.mkv

のようなコマンドでエンコードできます。

ポイントは-pix_fmt yuv420pの部分だと思います。-pix_fmt yuv420pのオプションを消してエンコードするとChroma subsamplingが4:4:4になるみたいです。ローカルPCでは正常に再生できますが、アップロードすると映像が乱れる場合があるようです。(YouTube以外でも動画アップロードに対応しているWebサービスでは-pix_fmt yuv420pのオプションを付けておいた方が良いみたいです。)

オプションについての簡単な説明

-c:v libx264は動画をx264でエンコードするという設定です。出力するファイルをoutput.mkvの代わりにoutput.mp4にする場合は、デフォルトでx264でエンコードの設定になるので省略できます。

-preset slowはエンコード速度に関する設定です。エンコードに時間を掛けてでも圧縮率を上げてファイルサイズを減らしたい場合はslow/slower/veryslowを使います。逆に少しでも短時間でエンコードを終わらせたい場合はmedium/fast/faster/veryfastを使います。

-crf 18の部分は動画のクオリティに関する部分になっています。画質を落としてでもファイルサイズを減らしたい場合は18より大きな値を設定します。逆に、ファイルサイズを増やして画質を上げたい場合は18より小さな値を設定します。

-c:a copyはオーディオについては再エンコードしないという設定です。AACで再エンコードしたい場合は-c:a aac -b:a 192kのような感じで設定します。(192kはオーディオのビットレートです。)

リンク

Encode/YouTube – FFmpeg
https://trac.ffmpeg.org/wiki/Encode/YouTube

C#で変数未初期化時の値

C#で変数を初期化しなかった場合、どのような値になるのか気になって初期値を調べてみました。

intなど0
floatなど0
boolfalse
nullがある型null
初期化しなかった場合の初期値

基本的には0になると思っていいのかなと思います。

構造体の場合は各メンバー変数が初期化された値で初期化されるみたいです。

リンク

Default values table – C# reference | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table

正規表現で文字列を分割したい場合はRegex.Split

C#で正規表現で文字列を分割したい場合はRegex.Splitが便利です。
使い方は次のような感じです。

数字で分割するサンプル

using System;
using System.Text.RegularExpressions;

public class Example1
{
  static public void Main ()
  {
    string pattern = "[0-9]+";
    string input = "abc123def456ghi";

    string[] result = Regex.Split(input, pattern);

    foreach(string s in result) Console.WriteLine(s);
  }
}

実行結果

abc
def
ghi

さらに、分割した文字列も表示したい場合は正規表現の( )を使います。

using System;
using System.Text.RegularExpressions;

public class Example2
{
  static public void Main ()
  {
    string pattern = "([0-9]+)";
    string input = "abc123def456ghi";

    string[] result = Regex.Split(input, pattern);

    foreach(string s in result) Console.WriteLine(s);
  }
}

実行結果

abc
123
def
456
ghi

正規表現が不要な場合はString.Splitも使えますので、いろいろ試してみてください。

リンク

Regex.Split Method (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.split?view=netframework-4.8

String.Split Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.string.split?view=netframework-4.8