При декодировании видео с FFMPEG и воспроизведением декодированных аудиоданных с SDL2, это все шумC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 При декодировании видео с FFMPEG и воспроизведением декодированных аудиоданных с SDL2, это все шум

Сообщение Anonymous »

Это код в основном потоке < /p>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Ffplay f;
f.start();
return a.exec();
}
< /code>
ffplay - это поток, который декодирует видео и воспроизводит его < /p>
class Ffplay : public QThread
{
Q_OBJECT
public:
Ffplay();
protected:
void run() override;
public:
AVFormatContext* format2;
Thread2 t2;
};
Ffplay::Ffplay() {}

void Ffplay::run(){
format2=avformat_alloc_context();
avformat_open_input(&format2,"c:/Qt/project/player/movie.mp4",NULL,NULL);
avformat_find_stream_info(format2,NULL);
t2.format=format2;
t2.start();
}
< /code>
Thread2 - это поток, который декорировал аудиопарию и воспроизводит ее < /p>
class Thread2 : public QThread
{
Q_OBJECT
public:
Thread2();
protected:
void run() override;
public:
AVFormatContext* format;
AVCodecContext* codec;
const AVCodec* c;
AVPacket* packet;
AVFrame* frame;
SwrContext* s;
FILE* f;
FILE* f2;

};
Thread2::Thread2() {}

struct Sound
{
Uint8* data;
Uint32 position=0;
Uint32 len;
};

Sound* d=new Sound;

void write(void* userdata,Uint8* stream,int len){
SDL_memset(stream,0,len);
int size2=std::min((Uint32)len,d->len-d->position);
SDL_memcpy(stream,d->data+d->position,size2);
d->position=d->position+size2;
}

void Thread2::run(){
int index=-1;
for(unsigned int i=0;inb_streams;i++){
if(format->streams->codecpar->codec_type==AVMEDIA_TYPE_AUDIO){
index=i;
break;
}
}
c=avcodec_find_decoder(format->streams[index]->codecpar->codec_id);
codec=avcodec_alloc_context3(c);
avcodec_parameters_to_context(codec,format->streams[index]->codecpar);
avcodec_open2(codec,c,NULL);
packet=av_packet_alloc();
frame=av_frame_alloc();
s=swr_alloc();
swr_alloc_set_opts2(&s,&codec->ch_layout,AV_SAMPLE_FMT_S16,codec->sample_rate,&codec->ch_layout,codec->sample_fmt,codec->sample_rate,0,NULL);
swr_init(s);
f=fopen("yinpin","wb");
uint8_t* buff=(uint8_t*)av_malloc(2*1024*4);
while(av_read_frame(format,packet)==0){
if(packet->stream_index==1){
avcodec_send_packet(codec,packet);
while(avcodec_receive_frame(codec,frame)>=0){
swr_convert(s,&buff,2*1024*2*2,(const uint8_t **)frame->data,frame->nb_samples);
int size=av_samples_get_buffer_size(NULL,2,frame->nb_samples,AV_SAMPLE_FMT_S16,1);
fwrite(buff,1,size,f);
}
}
}

SDL_Init(SDL_INIT_AUDIO);
SDL_AudioSpec spec;
spec.freq=48000;
spec.format=AUDIO_S16;
spec.channels=2;
spec.samples=1024;
spec.callback=write;
SDL_OpenAudio(&spec,NULL);
SDL_PauseAudio(0);
f2=fopen("yinpin","rb");
uint8_t* buff2=(uint8_t*)av_malloc(2*2*1024*2);
size_t size=10;
while(size>0){
size=fread(buff2,1,2*2*1024*2,f2);
d->data=buff2;
d->len=(Uint32)size;
}
}
< /code>
После запуска программы разыгрывается звук - это все, что меня немного запутало, потому что я не знаю, является ли это проблемой декодирования или проблемой воспроизведения звука SDL2. Есть ли метод устранения неполадок? Кто -нибудь выяснил источник проблемы?

Подробнее здесь: https://stackoverflow.com/questions/794 ... th-sdl2-it
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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