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

Поиск FOURCC кода в AVI - файле - C++

Восстановить пароль Регистрация
 
Cayenne52
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 7
03.06.2012, 16:20     Поиск FOURCC кода в AVI - файле #1
Здравствуйте!
Есть задача поиска FOURCC кода в видеофайле.
Написал программу. В некоторых файлах, все работает, в некоторых - нет.
Подозреваю, что проблема в том, что в одних файлах, 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
#include <iostream>
using namespace std;
#include <cstring>
 
int main()
{
    FILE *f=fopen("video.avi","r+");
    char buf[256];
    while(fgets(buf,256,f))
    {
        for(int i=1;i<256;i++)
        {
            if((buf[i]=='s')&&(buf[i+1]=='t')&&(buf[i+2]=='r')&&(buf[i+3]=='h'))
            {
                cout<<"Type of stream: "<<buf[i+8]<<buf[i+9]<<buf[i+10]<<buf[i+11]<<endl;
                cout<<"Type of codec: "<<buf[i+12]<<buf[i+13]<<buf[i+14]<<buf[i+15]<<endl;
                fclose(f);
                return 0;
            }
        }
    }
    fclose(f);
    return 0;
}
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2012, 16:20     Поиск FOURCC кода в AVI - файле
Посмотрите здесь:

Поиск в файле. C++
C++ Поиск в файле
C++ Поиск в файле
C++ Поиск в файле.
поиск в файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cactus09
Чайник
 Аватар для cactus09
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
03.06.2012, 18:20     Поиск FOURCC кода в AVI - файле #2
Я в этом деле полный нуб . Непонимаю зачем ты в файле ищещ "strh" я бы на твоем месте искал бы "RIFF".
Код
Форма записи

Для удобства записи в спецификациях используется следующая форма записи формата chunk’а:

ckID(<formType> ck)

Например, запись для AVI-файла: RIFF('AVI ' LIST('hdrl' avi_header) LIST ('movi' movi) [idx1]). (Квадратные скобки указывают на необязательность элемента.)
- пишет Википедиа
Миниатюры
Поиск FOURCC кода в AVI - файле  
Cayenne52
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 7
04.06.2012, 15:14  [ТС]     Поиск FOURCC кода в AVI - файле #3
Просто как правило, идет strh *stream**codec*
Так и какая разница, RIFF искать или STRH?

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
RIFF ('AVI '
      LIST ('hdrl'
            'avih'(<Main AVI Header>)
            LIST ('strl'
                  'strh'(<Stream header>)
                  'strf'(<Stream format>)
                  [ 'strd'(<Additional header data>) ]
                  [ 'strn'(<Stream name>) ]
                  ...
                 )
             ...
           )
      LIST ('movi'
            {SubChunk | LIST ('rec '
                              SubChunk1
                              SubChunk2
                              ...
                             )
               ...
            }
            ...
           )
      ['idx1' (<AVI Index>) ]
     )
Добавлено через 20 часов 48 минут
Что, никто больше не может помочь?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
04.06.2012, 20:51     Поиск FOURCC кода в AVI - файле #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
#include <algorithm>
#include <cstdio>
#include <cstring>
 
int main()
{
    FILE* pf = fopen("video.avi", "rb");
    if(pf)
    {
        const std::size_t bsize(128);
        char buf[bsize], *pSearch("movi"); // что ищем
        std::size_t readLen, pSearchLen(std::strlen(pSearch)), bufLeft(0), totalRead(0);
        do // цикл чтения и поиска
        {
            totalRead += (readLen = fread(buf + bufLeft, sizeof(*buf), bsize - bufLeft, pf));
            auto pRes = std::search(buf, buf + bufLeft + readLen, pSearch, pSearch + pSearchLen);
            if(pRes != buf + bufLeft + readLen) // если pSearch найдена
            {
                memmove(buf, pRes, buf + bufLeft + readLen - pRes);// то перетаскиваем её в начало buf
                bufLeft = buf + bufLeft + readLen - pRes;
                totalRead += (readLen = fread(buf + bufLeft, sizeof(*buf), bsize - bufLeft, pf)); // а в освободившееся место дочитываем из файла
                fwrite(buf, sizeof(*buf), bufLeft + readLen, stdout); // и выводим buf в консоль
                printf("\n\nindex: %u\n", totalRead - (bufLeft + readLen)); // и позицию(индекс) искомой строки в файле
                break;
            }
            else                           // если pSearch не найдена
            {
                memmove(buf, buf + bufLeft + readLen - pSearchLen, pSearchLen); // то перетаскиваем pSearchLen символов с конца в начало buf и в освободившееся место дочитываем из файла ( в новом цикле )
                bufLeft = pSearchLen;
            }
        }while(!(feof(pf)));
        fclose(pf);
    }
    else perror("fopen failed");
    return 0;
}
Cayenne52
0 / 0 / 0
Регистрация: 31.03.2011
Сообщений: 7
05.06.2012, 13:51  [ТС]     Поиск FOURCC кода в AVI - файле #5
Спасибо!
Yandex
Объявления
05.06.2012, 13:51     Поиск FOURCC кода в AVI - файле
Ответ Создать тему
Опции темы

Текущее время: 02:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru