Декодирование pcm_s16le с помощью FFMPEG?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Декодирование pcm_s16le с помощью FFMPEG?

Сообщение Anonymous »

У меня проблема с декодированием wav-файла с помощью ffmpeg. Я новичок в этом и не совсем к этому привык.
В моем приложении мне нужно ввести аудиофайл и получить массив сэмплов для работы.
Я использовал ffmpeg для создания функции, которая вводит путь к файлу, положение во времени, с которого нужно начать выводить сэмплы, и длину фрагмента для декодирования в секундах.
Когда я пытаюсь декодировать файл harp.wav все работает нормально, и я могу построить образцы, как на изображении plot-harp.png
Это файл WAV, закодированный как: pcm_u8, 11025 Гц, 1 канал, u8, 88 кбит/с
Проблемы возникают, когда я пытаюсь декодировать файл demo-unprocessed.wav.
Он выводит серию бессмысленных примеров. Он выводит серию образцов, представленных на изображении graph1-demo.jpg.
Это файл WAV, закодированный как: pcm_s16le, 44100 Гц, 1 канал, s16, 705 кбит/с.
IDK, где проблема в моем коде, я уже проверил код до и после декодирования с помощью FFMPEG, и он работает абсолютно нормально.
Вот код dataReader.cpp:

Код: Выделить всё

/* Start by including the necessary */
#include "dataReader.h"
#include 
#include 
#include 

#ifdef __cplusplus
extern "C" {
#endif
#include 
#include 
#include 
#ifdef __cplusplus
}
#endif

using namespace std;

/* initialization function for audioChunk */
audioChunk::audioChunk(){
data=NULL;
size=0;
bitrate=0;
}

/* function to get back chunk lenght in seconds */
int audioChunk::getTimeLenght(){
return size/bitrate;
}

/* initialization function for audioChunk_dNorm */
audioChunk_dNorm::audioChunk_dNorm(){
data=NULL;
size=0;
bitrate=0;
}

/* function to get back chunk lenght in seconds */
int audioChunk_dNorm::getTimeLenght(){
return size/bitrate;
}

/* function to normalize audioChunk into audioChunk_dNorm */
void audioChunk_dNorm::fillAudioChunk(audioChunk* cnk){

size=cnk->size;
bitrate=cnk->bitrate;

double min=cnk->data[0];
double max=cnk->data[0];

for(int i=0;isize;i++){
if(*(cnk->data+i)>max) max=*(cnk->data+i);
else if(*(cnk->data+i)data+i);
}

data=new double[size];

for(int i=0;idata[i]+256*data[i+1];
if(data[i]!=255) data[i]=2*((cnk->data[i])-(max-min)/2)/(max-min);
else data[i]=0;
}
cout

Подробнее здесь: [url]https://stackoverflow.com/questions/31730161/decoding-pcm-s16le-with-ffmpeg[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»