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

запись аудиофайла в массив байтов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
27.02.2012, 22:13     запись аудиофайла в массив байтов #1
привет!) подскажите пожалуйста, как записать аудио файл в массив байтов??? заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2012, 22:13     запись аудиофайла в массив байтов
Посмотрите здесь:

Как правильно объявить массив байтов? C++
Запись в массив C++
Получить массив байтов из int32_t C++
Запись в массив C++
C++ Запись в массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
27.02.2012, 23:05     запись аудиофайла в массив байтов #2
В bitset запихнул. Только не байт, а 8.
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
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#include <string>
 
int main(int argc, char* argv[])
{
    for(int i = 1; i < argc; ++i)
    {
        std::ifstream fin(argv[i]);
        if(!fin.is_open())
        {
            std::cerr << "cant open " << argv[i] << std::endl;
            continue;
        }
 
        std::vector<std::bitset<64>> myBitset;
        std::uint64_t n;
 
        while(fin.read(reinterpret_cast<char*>(&n), 8))
            myBitset.emplace_back(std::bitset<64>(n));
 
        for(const auto& it: myBitset)
            std::cout << it.to_string() << std::endl;
 
        fin.close();
    }
 
    return 0;
}
Bash
1
2
3
4
5
soon@desktop:~/Src/C++/main$ ./main ~/Music/Nickelback/Dark\ Horse/03\ -\ Gotta\ Be\ Somebody.mp3 > out
soon@desktop:~/Src/C++/main$ ls -lh ~/Music/Nickelback/Dark\ Horse/03\ -\ Gotta\ Be\ Somebody.mp3 ./out 
-rw-rw-r-- 1 soon soon 8.0M 2012-02-28 00:21 /home/soon/Music/Nickelback/Dark Horse/03 - Gotta Be Somebody.mp3
-rw-rw-r-- 1 soon soon  65M 2012-02-28 00:52 ./out
soon@desktop:~/Src/C++/main$
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
27.02.2012, 23:37  [ТС]     запись аудиофайла в массив байтов #3
огромное спасибо! буду разбираться)

Добавлено через 25 минут
Цитата Сообщение от soon Посмотреть сообщение
В bitset запихнул. Только не байт, а 8.
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
#include <fstream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <bitset>
#include <string>
 
int main(int argc, char* argv[])
{
    for(int i = 1; i < argc; ++i)
    {
        std::ifstream fin(argv[i]);
        if(!fin.is_open())
        {
            std::cerr << "cant open " << argv[i] << std::endl;
            continue;
        }
 
        std::vector<std::bitset<64>> myBitset;
        std::uint64_t n;
 
        while(fin.read(reinterpret_cast<char*>(&n), 8))
            myBitset.emplace_back(std::bitset<64>(n));
 
        for(const auto& it: myBitset)
            std::cout << it.to_string() << std::endl;
 
        fin.close();
    }
 
    return 0;
}
Bash
1
2
3
4
5
soon@desktop:~/Src/C++/main$ ./main ~/Music/Nickelback/Dark\ Horse/03\ -\ Gotta\ Be\ Somebody.mp3 > out
soon@desktop:~/Src/C++/main$ ls -lh ~/Music/Nickelback/Dark\ Horse/03\ -\ Gotta\ Be\ Somebody.mp3 ./out 
-rw-rw-r-- 1 soon soon 8.0M 2012-02-28 00:21 /home/soon/Music/Nickelback/Dark Horse/03 - Gotta Be Somebody.mp3
-rw-rw-r-- 1 soon soon  65M 2012-02-28 00:52 ./out
soon@desktop:~/Src/C++/main$

ругается вот на эти строчки....
C++
1
2
for(const auto& it: myBitset)
            std::cout << it.to_string() << std::endl;
вот такие ошибки получаются:
IntelliSense: невозможно вывести тип "авто" (требуется инициализатор)
IntelliSense: для ссылки переменная "it" требуется инициализатор
IntelliSense: требуется выражение

может не хватает каких библиотек??
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.02.2012, 00:04     запись аудиофайла в массив байтов #4
Версия компилятора? Есть подозрение, что он не поддерживает range-based-for

Можете заменить на
C++
1
2
3
for(std::vector<std::bitset<64> >::iterator it = myBitset.begin(); it != myBitset.end(); ++it)
{
    std::cout << it -> to_string() << std::endl;
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.02.2012, 00:08     запись аудиофайла в массив байтов #5
soon, вообщемто очень дорогостоящая реализация - допустим файл mp3 5Мб - это 5 * 1024 * 1024 объектов std::bitset - конечно современный комьютер все вытерпит..

Flamе, попробуйте
C++
1
2
3
for (std::vector<std::bitset<64> >::iterator it = myBitset.begin();it != myBitset.end();++it) {
            std::cout << it->to_string() << std::endl;
}
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
28.02.2012, 00:20  [ТС]     запись аудиофайла в массив байтов #6
Цитата Сообщение от soon Посмотреть сообщение
Версия компилятора? Есть подозрение, что он не поддерживает range-based-for

Можете заменить на
C++
1
2
3
for(std::vector<std::bitset<64> >::iterator it = myBitset.begin(); it != myBitset.end(); ++it)
{
    std::cout << it -> to_string() << std::endl;
да, видимо версия не подошла) теперь всё нормально) спасибо!)
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.02.2012, 00:27     запись аудиофайла в массив байтов #7
alex_x_x, а разве не 5 * 1024 * 128?

В общем-то да, многовато. Хотя без вывода у меня работает меньше секунды, а с выводом ~8.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.02.2012, 00:29     запись аудиофайла в массив байтов #8
soon, да, а в чем собсно смысл был по 8 байт - файл же может быть некратного 8 байтам размера?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
28.02.2012, 00:40     запись аудиофайла в массив байтов #9
alex_x_x, косяк. Я почему-то был уверен, что так будет лучше.
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
28.02.2012, 00:48  [ТС]     запись аудиофайла в массив байтов #10
файл размером 7 метров обошёлся примерно в 50000 строк вывода=)
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
28.02.2012, 22:50  [ТС]     запись аудиофайла в массив байтов #11
а как проделать обратную операцию (из массива записать в файл)?
я так понимаю изменится этот цикл
C++
1
2
3
for (std::vector<std::bitset<64> >::iterator it = myBitset.begin();it != myBitset.end();++it) {
            std::cout << it->to_string() << std::endl;
}
ну и собственно будет использоваться поток ofstream....
вот если делать по аналогии
то цикл будет такой:
C++
1
2
3
4
5
for (int i=0; i<myBitset.size(); i++)
           {
              std::bitset<64>(n)= myBitset[i];//наверное это бред, но больше в голову ничего не пришло=) 
               of.write(reinterpret_cast<char*>(&n), 8);
            }
???
и вроде бы в файл даже что-то пишется, но например если исходный файл был метра 3, то в новый записалось 9кб... и ничего конечно не воспроизводится.
подскажите, что не так?)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
28.02.2012, 23:26     запись аудиофайла в массив байтов #12
красиво я бы сделал так:
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <iterator>
 
typedef unsigned char BYTE;
 
int main() {
    const char* i_file = "1.mp3", *o_file = "2.mp3";
    std::vector<BYTE> v;
    std::ifstream i_f (i_file, std::ios_base::binary);
    
    if (!i_f) {
        std::cerr << "can't open file" << std::endl;
        return -1;
    }
    
    std::copy (std::istreambuf_iterator<char, std::char_traits<char> >(i_f.rdbuf()), 
               std::istreambuf_iterator<char, std::char_traits<char> >(), 
               std::back_inserter(v));
               
    std::ofstream o_f (o_file, std::ios_base::binary);
    
    if (!o_f) {
        std::cerr << "can't open output file" << std::endl;
        return -1;
    }
    
    std::cout << "get " << v.size() << " bytes" << std::endl;
    std::copy (v.begin(), v.end(), std::ostreambuf_iterator<char, std::char_traits<char> >(o_f.rdbuf()));
}
но правильней ящитаю
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
#include <iostream>
#include <fstream>
#include <vector>
 
int main() {
    const char* i_file = "1.mp3", *o_file = "2.mp3";
    std::vector<char> v;
    std::ifstream i_f (i_file, std::ios_base::binary);
    std::ofstream o_f (o_file, std::ios_base::binary);
    
    if (!i_f || !o_f) {
        std::cerr << "can't open file" << std::endl;
        return -1;
    }
    
    size_t size;
    i_f.seekg (0, std::ios::end);
    size = i_f.tellg();
    i_f.seekg (0, std::ios::beg);
    
    v.resize (size);
    i_f.read (&v.front(), size);
    
    std::cout << "get " << v.size() << " bytes" << std::endl;
    o_f.write (&v.front(), size);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 23:36     запись аудиофайла в массив байтов
Еще ссылки по теме:

C++ Выделить память под массив размера 2^64 байтов
C++ Запись файла в массив С++
Загрузка файла в массив байтов C++

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

Или воспользуйтесь поиском по форуму:
Flamе
9 / 9 / 0
Регистрация: 25.10.2009
Сообщений: 152
28.02.2012, 23:36  [ТС]     запись аудиофайла в массив байтов #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
красиво я бы сделал так:
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
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <iterator>
 
typedef unsigned char BYTE;
 
int main() {
    const char* i_file = "1.mp3", *o_file = "2.mp3";
    std::vector<BYTE> v;
    std::ifstream i_f (i_file, std::ios_base::binary);
    
    if (!i_f) {
        std::cerr << "can't open file" << std::endl;
        return -1;
    }
    
    std::copy (std::istreambuf_iterator<char, std::char_traits<char> >(i_f.rdbuf()), 
               std::istreambuf_iterator<char, std::char_traits<char> >(), 
               std::back_inserter(v));
               
    std::ofstream o_f (o_file, std::ios_base::binary);
    
    if (!o_f) {
        std::cerr << "can't open output file" << std::endl;
        return -1;
    }
    
    std::cout << "get " << v.size() << " bytes" << std::endl;
    std::copy (v.begin(), v.end(), std::ostreambuf_iterator<char, std::char_traits<char> >(o_f.rdbuf()));
}
но правильней ящитаю
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
#include <iostream>
#include <fstream>
#include <vector>
 
int main() {
    const char* i_file = "1.mp3", *o_file = "2.mp3";
    std::vector<char> v;
    std::ifstream i_f (i_file, std::ios_base::binary);
    std::ofstream o_f (o_file, std::ios_base::binary);
    
    if (!i_f || !o_f) {
        std::cerr << "can't open file" << std::endl;
        return -1;
    }
    
    size_t size;
    i_f.seekg (0, std::ios::end);
    size = i_f.tellg();
    i_f.seekg (0, std::ios::beg);
    
    v.resize (size);
    i_f.read (&v.front(), size);
    
    std::cout << "get " << v.size() << " bytes" << std::endl;
    o_f.write (&v.front(), size);
}

спасибо огромное!!!) проверила - оба варианта замечательно работают)
Yandex
Объявления
28.02.2012, 23:36     запись аудиофайла в массив байтов
Ответ Создать тему
Опции темы

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