Почему я получаю avc1.000000? (FFMPEG, кодирование видео H.264, C ++) - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть куча растровых изображений, и мне нужно сделать их закодированными в h.264 во фрагментированном .mp4. Я использую C ++. Что может привести к тому, что мой профиль AV C установлен в 0, SPS [], PPS [] и код c строка в avc1.000000?

Вывод из mp4info:

Файл:

вспомогательная версия: 200
совместимая марка: iso6
совместимая марка: mp41
быстрый запуск: да

Mov ie:

длительность: 0 мс
масштаб времени: 1000
фрагменты: да

Найдено 1 треков

Трек 1:
флаги: 3 ENABLED IN-MOV IE
id: 1
тип: Видео
длительность: 0 мс
язык: und

медиа:

отсчет выборки: 0
шкала времени: 90000
длительность: 0 (единицы шкалы времени мультимедиа)
длительность: 0 (мс)
битрейт (вычисляется): 412,672 Кбит / с
выборка с фрагментами: 35
длительность с фрагментами: 540000
длительность с фрагментами: 6000 (мс)

ширина экрана: 1280.000000
высота экрана: 720.000000

Пример описания 0

C oding: avc1 (H.264)
Ширина: n 1280
Высота: 720
Глубина: 24
AV C Профиль: 0
AV C Профиль Compat: 0
AV C Уровень: 0
AV C NALU Длина Размер: 0
AV C SPS: []
AV C PPS: []
Строка кодеков: avc1. 000000

Я использую такие вещи, как

if (stream->codecpar->codec_id == AVCodecID.AV_CODEC_ID_H264)
{
    err = ffmpeg.av_opt_set(cctx->priv_data, "preset", "ultrafast", 0);
    err = ffmpeg.av_opt_set(cctx->priv_data, "tune", "zerolatency", 0);
    err = ffmpeg.av_opt_set(cctx->priv_data, "profile", "high", 0);
} 

...

AVDictionary* opts = null;
ffmpeg.av_dict_set(&opts, "movflags", "default_base_moof+frag_keyframe+empty_moov", 0); 

...

AVPacket* pPacket = ffmpeg.av_packet_alloc();
try
{
    int error;
    do
    {
        ffmpeg.avcodec_send_frame(cctx, &convertedFrame).ThrowExceptionIfError();

        error = ffmpeg.avcodec_receive_packet(cctx, pPacket);
    } while (error == ffmpeg.AVERROR(ffmpeg.EAGAIN));

    error.ThrowExceptionIfError();

}
finally
{
    ffmpeg.av_packet_rescale_ts(pPacket, cctx->time_base, stream->time_base);
    pPacket->stream_index = stream->index;

    ffmpeg.av_interleaved_write_frame(ofctx, pPacket);
    ffmpeg.av_packet_unref(pPacket);
}

Чего мне не хватает? Я использую примеры из inte rnet. Думал, что если AVFrame кодируется (send_frame) с H264 с профилями и пресетами и принимается как AVPacket. Это должно быть сделано автоматически.

Это мой первый пост, пожалуйста, будьте любезны. Заранее спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...