ОК, нативный кодек просто не так хорош, как кодек libvpx, предоставляемый Webm peeps. Поэтому, если вы хотите получить эту альфа-информацию, вы должны перегрузить кодек при загрузке с помощью кодека libvpx.
Как вы это сделаете - см. Здесь: https://stackoverflow.com/questions/35340437/how-can-i-use-avformat-open-input-function-ffmpeg
По сути, третий аргумент avformat_open_input()
должен быть av_find_input_format("libvpx")
типомAVInputFormat
Если вы не уверены, является ли он кодеком VP8,9 в контексте файла, вам необходимо сначала проверить файл, обнаружить кодек, а затем перезаписать его при фактической загрузке. Смотрите здесь, чтобы узнать, как это сделать: https://stackoverflow.com/questions/14134589/what-does-the-avformat-open-input-do
и, наконец, - если вы хотите использовать собственный кодек вместо webm-кодека, если у него нет альфы (но зачем вам), то вы можете проверить, установлен ли его альфа-флаг, проверив данные стороны AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL.
Проверьте AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, если side_data начинается с (uint64_t) 1, есть слой прозрачности.
Но общее мнение таково: всегда использовать декодер libvpx.
Изменить: подробнее ID кодека Google VP8 - 139. и 167 - кодек Google VP9. Чтобы заменить версиями libvpx, вам нужно найти "libvpx-vp8" и "libvpx-vp9", используя, например, avcodec_find_decoder_by_name ("libvpx-vp9")