Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [FOX] Как проиграть Avi 
:(
    Опции темы
mrFOX
Дата 21.11.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.11.2008

Репутация: нет
Всего: нет



Добрый день, каким образом можно проиграть avi файл в foxe или другом кроссплатф. библ. - сам внедрю потом? Мне суть бы - как в оболочку встроить (объект какой использовать, или через WinApi делать), а то я некогда не работал с видео, а сейчас понадобилось.
PS Нашёл здесь - http://www.cyberguru.ru/cpp-sources/files-...t-avi-fajl.html, но разобраться не могу.
Спасибо.

Это сообщение отредактировал(а) mrFOX - 21.11.2008, 15:34
PM MAIL   Вверх
ecspertiza
Дата 25.11.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Рекомендую использовать связку SDL+ffmpeg, я когда занимался видео наблюдением мне помогло.
вот тебе код как проиграть видео
Код

#include <QApplication>
#include <ffmpeg/avcodec.h>
#include <ffmpeg/avformat.h>

#include <SDL/SDL.h>
#include <SDL/SDL_thread.h>
#include <stdio.h>


#include <stdio.h>

  AVFormatContext *pFormatCtx;
  int             i, videoStream;
  AVCodecContext  *pCodecCtx;
  AVCodec         *pCodec;
  AVFrame         *pFrame; 
  AVPacket        packet;
  int             frameFinished;
  float           aspect_ratio;

  SDL_Overlay     *bmp;
  SDL_Surface     *screen;
  SDL_Rect        rect;
  SDL_Event       event;
  
  char *filename="D:\Download\2.mjpeg";

int main(int argc, char *argv[]) {

  av_register_all();
  
  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
    fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
    exit(1);
  }

  if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0)
    return -1; // Couldn't open file
  
  // Retrieve stream information
  if(av_find_stream_info(pFormatCtx)<0)
    return -1; // Couldn't find stream information
  
  // Dump information about file onto standard error
  dump_format(pFormatCtx, 0, filename, 0);
  
  // Find the first video stream
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {
      videoStream=i;
      break;
    }
  if(videoStream==-1)
    return -1; // Didn't find a video stream
  
  // Get a pointer to the codec context for the video stream
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;
  
  // Find the decoder for the video stream
  pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  if(pCodec==NULL) {
    fprintf(stderr, "Unsupported codec!\n");
    return -1; // Codec not found
  }
  
  // Open codec
  if(avcodec_open(pCodecCtx, pCodec)<0)
    return -1; // Could not open codec
  
  // Allocate video frame
  pFrame=avcodec_alloc_frame();

  // Make a screen to put our video
        screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);

  if(!screen) {
    fprintf(stderr, "SDL: could not set video mode - exiting\n");
    exit(1);
  }
  
  // Allocate a place to put our YUV image on that screen
  bmp = SDL_CreateYUVOverlay(pCodecCtx->width,
                 pCodecCtx->height,
                 SDL_YV12_OVERLAY,
                 screen);


  // Read frames and save first five frames to disk
  i=0;
  while(av_read_frame(pFormatCtx, &packet)>=0) {
    // Is this a packet from the video stream?
    if(packet.stream_index==videoStream) {
      // Decode video frame
      avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
               packet.data, packet.size);
      
      // Did we get a video frame?
      if(frameFinished) {
    SDL_LockYUVOverlay(bmp);

    AVPicture pict;
    pict.data[0] = bmp->pixels[0];
    pict.data[1] = bmp->pixels[2];
    pict.data[2] = bmp->pixels[1];

    pict.linesize[0] = bmp->pitches[0];
    pict.linesize[1] = bmp->pitches[2];
    pict.linesize[2] = bmp->pitches[1];

    // Convert the image into YUV format that SDL uses

    
    SDL_UnlockYUVOverlay(bmp);
    
    rect.x = 0;
    rect.y = 0;
    rect.w = pCodecCtx->width;
    rect.h = pCodecCtx->height;
    SDL_DisplayYUVOverlay(bmp, &rect);
      
      }
    }
    
    // Free the packet that was allocated by av_read_frame
    av_free_packet(&packet);
    SDL_PollEvent(&event);
    switch(event.type) {
    case SDL_QUIT:
      SDL_Quit();
      exit(0);
      break;
    default:
      break;
    }

  }

  av_free(pFrame);
  

  avcodec_close(pCodecCtx);
  av_close_input_file(pFormatCtx);
  
}


если используешь OS Windows, то возможно будут трудности с интеграцией SDL, но всевышней Google тебе должен помоч.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
mrFOX
Дата 26.11.2008, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.11.2008

Репутация: нет
Всего: нет



Спасибо, обязательно осмотрю сей код.
Только всевышний Google уже тебя несколько опередил и я последовал его великоAPIшному примеру и сделал всё по его подобию и оно всё-таки почти заработало  smile .
Ну я же только в видео учусь, так что поизучаю всякие кода. Спасибо.
А пока вопрос к знатокам - по стандартным API функциям работы с AVI потокам. Всё сделал, почти работает. Но проблема - при вызове функции AVIStreamGetFrameOpen возвращает, что Frame не создан. Я грешу на предыдущие строки:

avi_hBitmap = CreateDIBSection(hdc, (BITMAPINFO*)(&avi_bmih), DIB_RGB_COLORS, (void**)(&avi_data), NULL, NULL);
    SelectObject (hdc, avi_hBitmap);   // Выбор hBitmap в наш контекст устройства (hdc)

а именно первую. Там создаётся дескриптор устройства растра, где hdc - совместимое контекстное устройство.

HDC hdc = CreateCompatibleDC(0); - мне кажется это не правильно. Я пишу весь этот код внутри класса FXMainWindow FOXа. Как правильно создать hdc здесь?

Это сообщение отредактировал(а) mrFOX - 26.11.2008, 14:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.