@Onion_era

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

OpenCVSharp4で動画ファイルが正しく保存できない

解決したいこと

OpenCVSharpを使って、ウェブカメラの映像を動画として保存するコードを書きましたが、保存したファイルが再生できません。
動画ファイルのフォーマットが、
・.mp4の場合
・.aviの場合
・.wmvの場合
でそれぞれ少しずつ違うメッセージ、症状になります。
上記の三種類以外でもいいので何らかのフォーマットで動画が正常に保存され、再生できるようにしたいです。

言語・環境
C#
VisualStudio 2019(Version 16.10.3)
.NET Framework(Version 4.8)
NuGetパッケージ
 ・OpenCVSharp4
 ・OpenCVSharp4.Extensions
 ・OpenCVSharp4.runtime.win
 ・OpenCVSharp4.runtime.win.cuda
 ・OpenCVSharp4.Windows
 ・OpenCVSharp4.WpfExtensions

発生している問題・エラー

[.mp4の場合]

ソースコードの//1の部分を有効にして実行すると出力に以下のメッセージが出ます。

OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 27 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'

保存された動画ファイルを再生しようとすると出るメッセージimage.png
MMname2で調べた動画ファイルの情報image.png

[.aviの場合]

エラーメッセージ等は無し

動画再生時
image.png

動画ファイルの情報
調べようとすると画像のエラーが出る
image.png

[.wmvの場合]

エラーメッセージ等は無し

動画再生時
メッセージは出ないが、動画の再生時間が0秒になっている

動画ファイルの情報
image.png

該当するソースコード

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            RecordAppControl();
        }

        private int RecordAppControl()
        {
            VideoCapture capture = new VideoCapture();
            capture.Open(1);
            if (!capture.IsOpened())
            {
                Console.WriteLine("Camera not activated.");
                return -1;
            }

            //1(mp4)
            VideoWriter video = new VideoWriter("result.mp4", OpenCvSharp.FourCC.H264, 30, new OpenCvSharp.Size(600, 300));

            //2(avi)
            //VideoWriter video = new VideoWriter("result.avi", OpenCvSharp.FourCC.DIVX, 30, new OpenCvSharp.Size(600, 300));

            //3(wmv)
            //VideoWriter video = new VideoWriter("result.wmv", OpenCvSharp.FourCC.WMV1, 30, new OpenCvSharp.Size(600, 300));

            Mat mat = new Mat();
            int count = 0;

            System.Timers.Timer recordControlTimer = new System.Timers.Timer(33);
            recordControlTimer.Elapsed += (sender, e) =>
            {
                if (count >= 150)
                {
                    recordControlTimer.Stop();
                    Console.WriteLine("Timer Stopped\n");
                    video.Dispose();
                    capture.Release();
                }
                else
                {
                    capture.Read(mat);
                    video.Write(mat);
                    pictureBox1.Image = BitmapConverter.ToBitmap(mat);
                    count++;
                }
            };
            recordControlTimer.Start();

            return 0;
        }
    }

自分で試したこと

最初にOpenH264を入れずに実行したところリンク先と同じエラーが出た。
openh264-1.8.0-win32.dllを入れた後はmp4の場合に書いたエラーが出るようになった。

0 likes

2Answer

Comments

  1. @Onion_era

    Questioner

    すみません、自分で試したことで「リンク先」と書きつつ貼り忘れてました…。貼ろうと思ってたのが、丁度提案していただいたページになります。

Comments

  1. @Onion_era

    Questioner

    解決方法メモ

    原因は VideoWriter video = new VideoWriter("result.mp4", OpenCvSharp.FourCC.H264, 30, new OpenCvSharp.Size(600, 300));のSizeの値だった。
    カメラの解像度と同じにする必要があるらしい。

    最終的に
    OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 27 and format 'mp4 / MP4 (MPEG-4 Part 14)'
    OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
    のエラーが出ていても動いた。

    今回使ったタイマはマルチスレッドなので、排他制御が必要だった。

Your answer might help someone💌