Accord.Video.FFMPEG создает видео очень низкого качества

Я использую Accord.Video.FFMPEG для создания видео из 200 изображений с кодеком H264. Почему-то видео очень плохого качества. Его размер составляет менее 1 МБ. При выборе VideoCodec.Raw качество высокое, но меня не устраивает огромный размер.

я делаю что-то вроде этого

using (var vFWriter = new VideoFileWriter())
{
    vFWriter.Open(video_name, 1920, 1080, 24, VideoCodec.H264);
    for (int i = 0; i < 200; ++i)
    {
        var img_name_src = ...
        using (Bitmap src_jpg = new Bitmap(img_name_src))
        {
            vFWriter.WriteVideoFrame(src_jpg);
        }
    }
    vFWriter.Close();
}

При запуске программы появляются сообщения:

[swscaler @ 06c36d20] deprecated pixel format used, make sure you did set range correctly
[swscaler @ 06e837a0] deprecated pixel format used, make sure you did set range correctly
[avi @ 06c43980] Using AVStream.codec.time_base as a timebase hint to the muxer is deprecated. Set AVStream.time_base instead.
[avi @ 06c43980] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.

Не знаю, влияют ли они на что-то.

Так выглядит 1 кадр:

введите здесь описание изображения

Это кадр из видео:

введите здесь описание изображения

Как это исправить?

Есть ли другой способ в С# создать видео из отдельных кадров?


person Кирилл Малышев    schedule 15.10.2019    source источник
comment
Я не пользуюсь Accord.net. Мой способ состоит в том, чтобы просто запустить FFmpeg.exe из C# в качестве внешнего Process и передать ему (каналу) растровые данные. См. также stackoverflow.com/a/13777166/2057709, например, параметры FFmpeg.   -  person VC.One    schedule 17.10.2019
comment
PS: я имел в виду эту статью для примеров трубопроводов. Затем также используйте параметры FFmpeg, показанные в моем комментарии выше. В любом случае, когда я получил видео такого плохого качества, мне пришлось установить вывод дважды в параметрах FFmpeg. Это как-то работало, но я сейчас не про Аккорд.   -  person VC.One    schedule 17.10.2019
comment
@VC.One, спасибо, вы мне помогли! Оно работает!   -  person Кирилл Малышев    schedule 18.10.2019


Ответы (1)


Обычно качество видео зависит от битрейта, который можно изменить с помощью этой перегрузки:

writer.Open(fileName, width, height, frameRate, VideoCodec, BitRate);

В миллионах видео все еще есть артефакты на кадрах с высокой детализацией, но в основном все в порядке. Однако в миллиардах артефакты полностью исчезают, но размер файла стремительно растет, а скорость воспроизведения зависит от времени извлечения с диска.

Попробуйте поэкспериментировать с различными видеокодеками, битрейтами и типами файлов (mp4, avi, webm и т. д.), чтобы найти подходящий баланс для вашего проекта.

person Sean Docherty    schedule 11.02.2021