Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 10:51   #1
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию Ошибка загрузки кодека (libavcodec)

В программе необходимо рендерить видео, для чего было решено использовать библиотеку FFMPEG. За основу для проверки был взят шаблонный код, изменённый под последнюю ревизию бибилотеки (удален вызов avcodec_init(), avcodec_open() заменен на avcodec_open2(..., NULL)).
Поскольку кодек у всех видео одинаковый (WMV3), то в код было внесено еще одно изменение:
Код:
codec = avcodec_find_decoder(AV_CODEC_ID_WMV3);
И.. Программа спотыкается при открытии кодека:
Код:
    if (avcodec_open2(c, codec, NULL) < 0) {
        ERROR_MESSAGE("could not open codec\n");
        exit(1);
    }
Более ранние версии данного кодека выдают ошибку декодирования видео и открытия кодека:
Код:
AV_CODEC_ID_WMV2:
[wmv2 @ 0xb3e6f0] [IMGUTILS @ 0x7fffcbb28790] Picture size 0x0 is invalid
could not open codec
Никак не могу понять, что же не нравится в кодеке Тот же MPlayer отлично воспроизводит тестовый файл, используя эту же библиотеку...
andreil вне форума Ответить с цитированием
Старый 17.12.2013, 12:27   #2
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Решил зайти с другой стороны - через avformat:
Код:
void decode(const char *fn)
{
     AVFormatContext *av_ctx = avformat_alloc_context();

    #ifdef USE_STREAM
    Stream *stream = new Stream(fn, FILE_OPEN_READ_ST);
    if (stream->getFileStreamHandle() == INVALID_HANDLE_VALUE)
        return;

    uint8_t buf[30000];
    AVIOContext *io_ctx = avio_alloc_context(buf, INBUF_SIZE, 0, stream, readFunction, NULL, seekFunction);
    av_ctx->pb = io_ctx;
    #endif

    #ifdef USE_STREAM
    if (avformat_open_input(&av_ctx, "dummyFilename", NULL, NULL) != 0)
    #else
    if (avformat_open_input(&av_ctx, fn, NULL, NULL) != 0)
    #endif
    {
        ERROR_MESSAGE("Video: unble to open file\n");
        return;
    }
        else NORMA_MESSAGE("Video: File opened\n");

    if (avformat_find_stream_info(av_ctx, NULL) < 0)
    {
        ERROR_MESSAGE("Video: Couldn't find stream information\n");
        return;
    }
        else NORMA_MESSAGE("Video: Finded streams info\n");

    AVCodecContext *c_ctx;
    int videoStream = -1;
    for (uint32_t i=0 ; i<av_ctx->nb_streams ; i++)
        if (av_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
        {
            videoStream = i;
            break;
        }
    if (videoStream == -1)
    {
        ERROR_MESSAGE("Video: Didn't find a video stream\n");
        return;
    }
    NORMA_MESSAGE("Video: Video stream finded\n");
    c_ctx = av_ctx->streams[videoStream]->codec;

    AVCodec *codec;
    codec = avcodec_find_decoder(c_ctx->codec_id);
    if (codec == NULL)
    {
        ERROR_MESSAGE("Video: Codec not found\n");
        return;
    }
    else
        NORMA_MESSAGE("Video: Codec %s\n", c_ctx->codec->long_name);
    if (avcodec_open2(c_ctx, codec, NULL) < 0)
    {
        ERROR_MESSAGE("Video: Could not open codec\n");
        return;
    }
    NORMA_MESSAGE("Video: \n");
}
При вызове avformat_find_stream_info выбивает "Segmentation fault":
Цитата:
[asf @ 0x7f0cca316220] Format asf probed with size=2048 and score=100
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=26
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=4005
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=30
[asf @ 0x7f0cca316220] Payload extension 50 2
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=34
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=34
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=38
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=44
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=126
[asf @ 0x7f0cca316220] gpos mismatch our pos=24, end=32
Video: File opened
[asf @ 0x7f0cca316220] File position before avformat_find_stream_info() is 5273
[wmv3 @ 0x7f0cc8d9d920] Header: 4DF90801
[wmv3 @ 0x7f0cc8d9d920] Profile 1:
frmrtq_postproc=6, bitrtq_postproc=31
LoopFilter=1, MultiRes=0, FastUVMC=0, Extended MV=0
Rangered=0, VSTransform=1, Overlap=0, SyncMarker=0
DQuant=0, Quantizer mode=0, Max B frames=0
[wmv3 @ 0x7f0cc8d9d920] Extra data: 8 bits left, value: 0
[asf @ 0x7f0cca316220] All info found
Ошибка сегментирования
andreil вне форума Ответить с цитированием
Старый 17.12.2013, 13:41   #3
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

libvacodec и "Общие вопросы C/C++" - это как Слава КПСС. Слава - совсем не имя.
nikmoon вне форума Ответить с цитированием
Старый 17.12.2013, 14:34   #4
andreil
Пользователь
 
Регистрация: 19.12.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
libvacodec и "Общие вопросы C/C++" - это как Слава КПСС. Слава - совсем не имя.
А куда тогда переместить? В "Кроссплатформенное программирование C/C++"? Извините, но туда не проходит, ибо мне в данном участке кода (вполне самодостаточном, кстати) не нужна кросплатформа. У меня косяк со стандартной, по сути своей, библиотекой (ибо она путешествует со многими программами).

PS: Видимо, придется самому шариться по сырцам декодера и портировать его в свой проект...
andreil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка загрузки корневого сертификата foxm Работа с сетью в Delphi 4 29.08.2013 14:59
Пример с использованием ACC кодека bookkc Помощь студентам 1 21.10.2010 21:46
Ошибка загрузки файла на FTP!!! $T@LKER Работа с сетью в Delphi 7 16.05.2010 18:33
ошибка загрузки страницы Vitek-pm Общие вопросы C/C++ 0 01.03.2009 01:11