Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.96
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
#1

ffmpeg - C++

06.09.2011, 16:19. Просмотров 3374. Ответов 13
Метки нет (Все метки)

Всем привет, помогите начинающему разобраться с такой проблемой: ffmpeg + sdl - очень долго приложение сидит в функции av_find_stream_info (от 2 до 10 секунд). В чем может быть проблема?
Заранее благодарен!

Добавлено через 1 минуту
Файлы размером, в среднем, 40 Мб.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2011, 16:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ffmpeg (C++):

ffmpeg конвертация файла - C++
Всем привет! Делаю первые шаги в ffmpeg'e. Для начала просто решил без конвертации раскодировать один файл и сделать другой. Вот код ...

Ffmpeg конфликт библиотек - C++
В проекте возникает потребность пользоваться одновременно (или хотя бы поочерёдно) этими библиотеками #include <libavcodec/avcodec.h> ...

Подключение библиотеки ffmpeg к проекту - C++
Здравствуйте. Я начал разбираться с библиотекой ffmpeg. Но не пойму как ее можно подключить к проекту в С++ и можно ее подключить и...

Обработка массива байт проходящих с ip -камеры ffmpeg' ом - C++
Всем доброго времени суток. С обработкой видео которое сохранено в файле ffmpeg'ом все понятно. А как можно обработать массив байт,...

Ffmpeg изменение bit_rate не влияет на качество записи видео - C++
имеется код выполняющий кодирование и запись видео в файл extern "C" { #include <libavformat/avformat.h> #include...

Фильтры в ffmpeg: нужно ли отдельными функциями заполнять AVFilterContext? - C++
Здравствуйте. В интернете в статье программирования на базе ffmpeg приводился пример с использованием функция для заполнения...

13
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
06.09.2011, 18:03 #2
av_find_stream_info is deprecated. Если ты используешь старую версию FFMPEG, то советую перейти на более новую. Если же нет, то советую переписать код.
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
06.09.2011, 22:08  [ТС] #3
FFMPEG советуют использовать вместо нее avformat_find_stream_info. но результат тот же..именно в этой функции все дружно подтормаживает....Может быть есть еще какие то соображения? Спасибо!
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
08.09.2011, 10:39 #4
Других соображений нет.
Могу только сказать что конструкция:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
int ffmpeg_open( char *filename, int *freq, int *channels )
{
    int         r;
    AVCodec *   dec;
 
    fmt_ctx = NULL;
    dec_ctx = NULL;
    aud_stream = -1;
 
    if ( (r = avformat_open_input( &fmt_ctx, filename, NULL, NULL )) >= 0 ) {
        if ( (r = av_find_stream_info( fmt_ctx )) >= 0 ) {
 
            /* select the audio stream */
            r = av_find_best_stream( fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &dec, 0 );
            if ( r >= 0 ) {
                aud_stream = r;
                dec_ctx = fmt_ctx->streams[aud_stream]->codec;
 
                if ( dec->capabilities & CODEC_CAP_TRUNCATED ) {
                    printf( "CODEC_CAP_TRUNCATED ok\n" );
                    dec_ctx->flags |= CODEC_FLAG_TRUNCATED;
                }
 
                *freq = dec_ctx->sample_rate;
                *channels = dec_ctx->channels;
 
                if ( (r = avcodec_open( dec_ctx, dec )) >= 0 ) {
                    return r;   // OK
 
                } else {
                    av_log( NULL, AV_LOG_ERROR, "Cannot open audio decoder\n" );
                }
            } else {
                switch ( r ) {
                    case AVERROR_STREAM_NOT_FOUND:
                        av_log( NULL, AV_LOG_ERROR, "Cannot find a audio stream in the input file\n" );
                        break;
 
                    case AVERROR_DECODER_NOT_FOUND:
                        av_log( NULL, AV_LOG_ERROR, "Cannot find a audio codec for the input file\n" );
                        break;
 
                    default:
                        av_log( NULL, AV_LOG_ERROR, "Unknown [av_find_best_stream()] error\n" );
                        break;
                }
            }
        } else {
            av_log( NULL, AV_LOG_ERROR, "Cannot find stream information\n" );
        }
    } else {
        av_log( NULL, AV_LOG_ERROR, "Cannot open input file\n" );
    }
    return r;
}
у меня работает без проблем.
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
08.09.2011, 16:11  [ТС] #5
Спасибо большое, буду пробовать!!!

Добавлено через 5 часов 18 минут
Если не сложно посоветуйте еще по такому вопросу....Сам плеер вроде бы отладил...проблема сейчас такая: нужно проиграть файлы которые находятся на другой машине в расшаренном каталоге, при открытии 5 секундная задержка как минимум....если посмотреть диспетчер задач, то в момент открытия возрастает нагрузка на сеть плюс оперативная память, которая выделяется под плеер, вырастает ровно на 40 Мб(размер avi файла) что можно сделать в данной ситуации? Спасибо!
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
08.09.2011, 21:42 #6
По-моему все логично, 5 секунд тратиться на загрузку файла размером 40Мб.
У тебя же не потоковое вещание идет, думаю что так и должно быть.

Я использовал http://ffmpeg.zeranoe.com/builds/ если что.
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
26.09.2011, 18:36  [ТС] #7
lazybiz, Здравствуйте, вы не могли бы помочь мне по ffmpeg. У меня сейчас такая беда: не освобождается оперативная память.
очистку выполняю следующим образом:
av_close_input_file(is->pFormatCtx);
packet_queue_flush1(&is->videoq);

Кодеки я далее использую повторно, поэтому очищать их не нужно. то есть очистку делаю только очереди для видеопотока, и закрываю файл.
Функция очистки очереди выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void packet_queue_flush1(PacketQueue *q) 
{
AVPacketList *pkt, *pkt1;
  int cnt = 0;
  SDL_LockMutex(q->mutex);
 
  for(pkt = q->first_pkt; pkt != NULL; pkt = pkt1) 
  {
    cnt++;
    pkt1 = pkt->next;
    
    av_free_packet(&pkt->pkt);
    av_freep(pkt);
  }
 
  q->last_pkt = NULL;
  q->first_pkt = NULL;
  q->nb_packets = 0;
  q->size = 0;
 
  SDL_UnlockMutex(q->mutex);
}
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
26.09.2011, 19:15 #8
Трудно что-либо сказать. В коде можно полностью убрать переменную cnt но это не решит Вашей проблемы.
Есть несколько вопросов:
1. Память, используемая программой, постоянно растет?
2. Освобождаются ли фрэймы посредством av_free( frame ) ?
3. Можете ли выложить на форум/скинуть на почту (bizn@inbox.ru) код целиком?
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
27.09.2011, 09:57  [ТС] #9
Здравствуйте!
Ситуация примерно следующая:
1. Имеется так скажем плейлист из списка файлов.
2. При воспроизведении 1-го файла инициализируются кодеки и т.д.
3. Далее, для открытия последующих файлов используются те же самые кодеки (это сделано для ускорения работы)
4. Размер очереди для видеопотока делал различную, сейчас она размером в 1.5 МБ
5. После закрытия файла, то есть после выполнения функций: avcodec_flush_buffers(is->videoCodec);
av_close_input_file(is->pFormatCtx);
память освобождается но не до исходного размера, остается не освобожденным примерно 1 МБ, может быть чуть больше.
6. Таким образом с каждого файла получается прирост неосвобожденной памяти около 1 - 1.5 МБ. (Это число очень похоже на размер очереди)
7. Поэтому я пробовал создавать очередь в 15 МБ, скажем, картина была такая что после воспроизведения файла и с течением определенного времени за которое декодировался видеопоток и очередь заполнялась память вырастала на данные 15 МБ, после этого я вызываю функцию очистки очереди и из этих 15 МБ очищается мегабайт 7 от силы.
8. Для следующего файла используется тот же самый указатель на очередь, то есть для всех файлов я использую одну глобальную структуру VideoState.
9. Еще такой странный факт, что если сделать размер очереди меньше мегабайта, ну, скажем, пол мегабайта, то прирост памяти составляет как раз те самые пол мегабайта с файла.

Как такое может происходить, что очередь малого размера не очищается вообще, а если размер большой - то только частично?

Извиняюсь за такое кривое описание, но, если вы можете помочь, то я был бы очень признательным!

фрэймы очищаются.
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
27.09.2011, 17:00 #10
Опять же очень трудно что-либо сказать видя только функцию packet_queue_flush1() и то описание которое Вы дали.
Чтобы Вам помочь нужно видеть код целиком.
Не исключаю и того, что это может быть багом данной версии FFMPEG.
Кстати, инициализацию кодеков я бы перенес в отдельную функцию, и вызывал бы ее в самом начале.
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
03.10.2011, 15:52  [ТС] #11
Спасибо, с памятью вопрос решил. Если вам не сложно, можете помочь с такой проблемой:
Проигрываю поочередно файлы, что бы воспроизвести звук при открытии нового файла вызываю SDL_OpenAudio, затем SDL_PauseAudio. Далее при воспроизведении следующего файла вызываю SDL_CloseAudio и далее снова SDL_OpenAudio, SDL_PauseAudio. Возникают такие ситуации когда все зависает на функции SDL_CloseAudiо, может быть я что то не так делаю?
Заранее спасибо!
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.10.2011, 16:08 #12
Увы, но с SDL тесного знакомства не имел
1
ilgiz_vafin
1 / 1 / 0
Регистрация: 05.09.2011
Сообщений: 11
03.10.2011, 16:10  [ТС] #13
В любом случае спасибо, не подскажете куда мне с таким вопросом обратиться?
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
03.10.2011, 16:20 #14
.
0
03.10.2011, 16:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2011, 16:20
Привет! Вот еще темы с ответами:

Ffmpeg выдает moov atom not found если прервать процесс кодирования - C++
имеется код выполняющий кодирование и запись видео в файл (через avio_open2 / avformat_write_header / av_interleaved_write_frame /...

FFmpeg - Debian Linux
Как установить ffmpeg под lamp?

FFmpeg - PHP
Всем привет! Снял хостинг best-hoster.ru, но там не работает ни exec() ни system() , а мне нужен к ним доступ, т.к. необходимо...

Ffmpeg на С++ - C++
можете дать ссылку на описание или подсказать какую нибудь литературу как использовать ffmpeg под Visual Studio?? Как писать программы на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru