Есть ли способ заставить ffmpeg декодировать видеопоток с альфа-видео из видео WebM, кодируемого с Libvpx-VP9?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ заставить ffmpeg декодировать видеопоток с альфа-видео из видео WebM, кодируемого с Libvpx-VP9?

Сообщение Anonymous »

У меня есть файл Webm с одним видеопотоком, который был кодирован с VP9 (Libvpx-Vp9). < /p>
Я написал программу C ++, чтобы извлечь кадры из видеопотока и сохранить их как PNG. Это работает нормально, за исключением того, что полученные PNG отсутствуют Alpha. Вот выход из FFMPEG: < /p>

Код: Выделить всё

$ ffmpeg -c:v libvpx-vp9 -i temp/anim.webm temp/output-%3d.png

[libvpx-vp9 @ 0000024732b106c0] v1.10.0-rc1-11-gcb0d8ce31
Last message repeated 1 times
Input #0, matroska,webm, from 'temp/anim.webm':
Metadata:
ENCODER         : Lavf58.45.100
Duration: 00:00:04.04, start: 0.000000, bitrate: 112 kb/s
Stream #0:0: Video: vp9 (Profile 0), yuva420p(tv), 640x480, SAR 1:1 DAR 4:3, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode      : 1
ENCODER         : Lavc58.91.100 libvpx-vp9
DURATION        : 00:00:04.040000000
< /code>
ffmpeg идентифицирует формат потока как yuva420p. < /p>
Вот вывод моей программы, когда называется AV_DUMP_FORMAT: < /p>
Input #0, matroska,webm, from 'temp/anim.webm':
Metadata:
ENCODER         : Lavf58.45.100
Duration: 00:00:04.04, start: 0.000000, bitrate: 112 kb/s
Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv), 640x480, SAR 1:1 DAR 4:3, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode      : 1
ENCODER         : Lavc58.91.100 libvpx-vp9
DURATION        : 00:00:04.040000000
< /code>
Обратите внимание, что обнаруженный формат потока является yuv420p (альфа отсутствует). < /p>
Кто-нибудь знает, как заставить формат потока использовать Alpha?auto result = avformat_open_input(&formatContext, fileName.c_str(), nullptr, nullptr);
auto result = avformat_find_stream_info(formatContext, nullptr);
streamIndex = av_find_best_stream(formatContext, mediaType, -1, -1, nullptr, 0);
auto stream = formatContext->streams[streamIndex];
const auto codecIdentifier{ AV_CODEC_ID_VP9 };
auto decoder = avcodec_find_decoder(codecIdentifier);
pCodecContext = avcodec_alloc_context3(decoder);
auto result = avcodec_open2(pCodecContext, decoder, &options);
// AV_PIX_FMT_YUV420P - missing alpha
auto pixelFormat = pCodecContext->pix_fmt;
< /code>
Гиан указал, в чем проблема. Вот исправленный код: < /p>
На случай, если кто-то еще столкнется с этим вопросом в будущем, вот код (обработка ошибок опущена): < /p>
auto formatContext = avformat_alloc_context();
formatContext->video_codec_id = AV_CODEC_ID_VP9;
const auto decoder = avcodec_find_decoder_by_name("libvpx-vp9");
formatContext->video_codec = decoder;
avformat_open_input(&formatContext, fileName.c_str(), nullptr, nullptr);
avformat_find_stream_info(formatContext.get(), nullptr);
for (unsigned int streamIndex = 0; streamIndex < formatContext->nb_streams; ++streamIndex) {
// Displayed the stream format as yuva420p (contains alpha)
av_dump_format(formatContext, static_cast(streamIndex), fileName.toStdString().c_str(), 0);
}
Спасибо,


Подробнее здесь: https://stackoverflow.com/questions/667 ... rom-a-webm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»