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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
#1

Конвертация фрейма в формате AAC в PCM - C++

18.05.2015, 14:17. Просмотров 1997. Ответов 2

Необходимо конвертировать фрейм в формате AAC в фрейм в формате PCM. Желательно с использованием библиотеки ffmpeg.

Есть проба пера, но почему-то функция avcodec_decode_audio4 возвращает код -1 (Operation not permitted)
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
56
57
58
59
60
61
62
63
64
65
bool AacToPcm (char *inBuffer, int inSize, char** outBuffer, int* outSize)
{
    if(inBuffer == 0) return false;
 
    u_int8_t inputBytes[inSize + FF_INPUT_BUFFER_PADDING_SIZE];
    memset(inputBytes, 0, inSize + FF_INPUT_BUFFER_PADDING_SIZE);
    memcpy(inputBytes, inBuffer, inSize);
 
    avcodec_register_all();
    av_register_all();
 
    AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_AAC);
    if(codec == 0) return false;
    AVCodecContext *avCtx = avcodec_alloc_context3(codec);
    if(avCtx == 0) return false;
    avCtx->sample_fmt = AV_SAMPLE_FMT_S16;
    avCtx->bit_rate = 32000;
    avCtx->sample_rate = 48000;
    avCtx->channels = 1;
    avCtx->channel_layout = AV_CH_LAYOUT_MONO;
 
    int retval = avcodec_open2(avCtx, codec, 0);
    if (retval < 0)
    {
        avcodec_close(avCtx);
        av_free(avCtx);
        return false;
    }
 
    // create input buffer as avpacket
    AVPacket avPacket;
    av_init_packet(&avPacket);
    avPacket.size = inSize;
    avPacket.data = inputBytes;
 
   AVFrame * pDecodedFrame = avcodec_alloc_frame();
   pDecodedFrame->nb_samples = avCtx->frame_size;
   pDecodedFrame->format = avCtx->sample_fmt;
   pDecodedFrame->channel_layout = avCtx->channel_layout;
   pDecodedFrame->sample_rate = avCtx->sample_rate;
   pDecodedFrame->channels = avCtx->channels;
 
    int nGotFrame = 0;
    int cbDecoded = avcodec_decode_audio4(avCtx, pDecodedFrame, &nGotFrame, &avPacket);
    int data_size = av_samples_get_buffer_size(0,  avCtx->channels,  pDecodedFrame->nb_samples, avCtx->sample_fmt, 1);
 
    if(data_size < 0)
    {
        avcodec_free_frame(&pDecodedFrame);
        avcodec_close(avCtx);
        av_free(avCtx);
 
        return false;
    }
 
    *outSize = data_size;
    *outBuffer = new char[*outSize];
    memcpy(*outBuffer, (char*)pDecodedFrame->data[0], *outSize);
 
    avcodec_free_frame(&pDecodedFrame);
    avcodec_close(avCtx);
    av_free(avCtx);
 
    return cbDecoded != 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2015, 14:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конвертация фрейма в формате AAC в PCM (C++):

Напишите программу, которая бы читала дерево в формате (а) и затем печатала бы это дерево в формате (б). - C++
Представление дерева: а) Д (Б (А, Ф (В,)), Е (,З (Ж, И))) б) Д Б А Ф ...

Конвертация фрейма HEVC в h264 по средствам C API фреймворка ffMpeg - C++ Linux
Есть HEVC-поток из IP камеры, нужно получить соответственно H264-поток... Приложение в работе использует фреймворк ffMpeg. Пробовал...

Воспроизведение звука в PCM формате - C#
Здравствуйте, помогите, пожалуйста с такой задачей: есть массив значений, представляющий собой звук в формате PCM. Как воспроизвести этот...

Как из одного фрейма обратиться к содержимому формы другого фрейма? - JavaScript
страница состоит из нескольких фреймов. Как из одного фрейма обратиться к содержимому формы другого фрейма?...плизззз намыльте

Как из правого фрейма обратиться к 3-й картинке левого фрейма? - JavaScript
Окно разделено на два фрейма с именами left и right. Как из правого фрейма обратиться к 3-й картинке левого фрейма? (Ответ считается...

Меню из фрейма поверх другого фрейма - HTML, CSS
Здравствуйте! Ребята у меня такая проблема есть 4 фрейма(верхний(logo), боковой, основной(mainFrame) и нижний). В верхний фрэйм я...

2
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
22.05.2015, 10:25 #2
А что на вход подаётся? Если есть небольшой файл то можно прикрепить.

Добавлено через 38 минут
Немого переписал, заменил deprecated функции. Ошибок нет.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <cstdint>
#include <vector>
#include <iostream>
#include <fstream>
 
extern "C" {
 #define __STDC_CONSTANT_MACROS
 #include <libavformat/avformat.h>
 #include <libavcodec/avcodec.h>
 #include <libswscale/swscale.h>
}
 
bool load_file( std::vector <uint8_t> & buffer, const char * filename ) {
    std::ifstream file( filename, std::ios::in | std::ios::binary | std::ios::ate );
    std::streamsize size = 0;
    if ( file.seekg( 0, std::ios::end ).good() ) size = file.tellg();
    if ( file.seekg( 0, std::ios::beg ).good() ) size -= file.tellg();
    if ( size > 0 ) {
        buffer.resize( (size_t)size );
        file.read( (char *)(&buffer[0]), size );
        return true;
    }
    buffer.clear();
    return false;
}
 
bool AacToPcm( uint8_t * inBuffer, int inSize, uint8_t ** outBuffer, int * outSize ) {
 
    uint8_t * inputBytes = new uint8_t [inSize + FF_INPUT_BUFFER_PADDING_SIZE];
    memset( inputBytes, 0, inSize + FF_INPUT_BUFFER_PADDING_SIZE );
    memcpy( inputBytes, inBuffer, inSize );
 
    avcodec_register_all();
    av_register_all();
 
    bool result = false;
    AVCodec * codec = avcodec_find_decoder( AV_CODEC_ID_AAC );
    if ( codec ) {
        AVCodecContext * avCtx = avcodec_alloc_context3( codec );
        if ( avCtx ) {
            avCtx->sample_fmt       = AV_SAMPLE_FMT_S16;
            avCtx->bit_rate         = 32000;
            avCtx->sample_rate      = 48000;
            avCtx->channels         = 1;
            avCtx->channel_layout   = AV_CH_LAYOUT_MONO;
            if ( avcodec_open2( avCtx, codec, 0 ) >= 0 ) {
 
                AVPacket avPacket;
                av_init_packet( &avPacket );
                avPacket.size = inSize;
                avPacket.data = inputBytes;
 
                AVFrame * frame = av_frame_alloc();
                frame->nb_samples = avCtx->frame_size;
                frame->format = avCtx->sample_fmt;
                frame->channel_layout = avCtx->channel_layout;
                frame->sample_rate = avCtx->sample_rate;
                frame->channels = avCtx->channels;
 
                int nGotFrame = 0;
                int cbDecoded = avcodec_decode_audio4( avCtx, frame, &nGotFrame, &avPacket );
                if ( cbDecoded > 0 && nGotFrame ) {
                    int data_size = av_samples_get_buffer_size( 0,  avCtx->channels,  frame->nb_samples, avCtx->sample_fmt, 1 );
                    if ( data_size > 0 ) {
                        *outSize = data_size;
                        *outBuffer = new uint8_t [*outSize];
                        memcpy( *outBuffer, (uint8_t *)frame->data[0], *outSize );
                        result = true;
                    }
                }
                av_frame_free( &frame );
            }
            av_free( avCtx );
        }
        avcodec_close( avCtx );
    }
    delete [] inputBytes;
    return result;
}
 
int main()
{
    std::vector <uint8_t> data;
 
    if ( load_file( data, "test2.adts" ) ) {
        std::cout << data.size() << std::endl;
 
        uint8_t * out;
        int out_size;
        if ( AacToPcm( data.data(), data.size(), &out, &out_size ) ) {
            std::cout << "ok\n";
        } else {
            std::cout << "fail\n";
        }
    }
    return 0;
}
1
Lord_Voodoo
Супер-модератор
8594 / 2209 / 61
Регистрация: 07.03.2007
Сообщений: 10,967
Завершенные тесты: 1
29.05.2015, 13:38  [ТС] #3
castaway, пока проверить не могу, камера уехала... но обязательно отпишусь, как будет возможность... спасибо за помощь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2015, 13:38
Привет! Вот еще темы с ответами:

Программа для работы с dts, ac3, aac - Софт
Что прошу: сказать, какими программами можно нормально разбить dts или ac3 на wav'ы, а потом пережать в aac. Еще я где-то прочитал, что все...

надо из одного фрейма при дблклике в поле копировать содержимое поля в поле второго фрейма. - JavaScript
надо из одного фрейма при дблклике в поле копировать содержимое поля в поле второго фрейма. Следующий код работает только в IE, а как...

Печать фрейма, из другого фрейма - JavaScript
У меня следующая проблема. Есть сайт с двумя фреймами - один статичен, другой динамичен. Надо что бы кнопка 'печать' распологалась в...

PCM vs APC - Блоки питания
Хочу на сервак взять ИБП. Остановился на 2-х ИБП 1. APC Back-UPS 1100VA 2. Powercom IMD-1025AP LCD АРС на 50% дороже РСМ, но стоит...


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

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

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