8
Tôi sử dụng đoạn mã sau để giải mã các tệp âm thanh (được thử nghiệm bằng MP3, WAV, WMV).Giải mã âm thanh bằng cách sử dụng libavcodec và phát bằng libAO?
Nhưng khi phát âm thanh, nó chỉ phát ra âm thanh tĩnh và treo theo thời gian. Bất kỳ gợi ý nào về những gì tôi đang làm sai ở đây?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
extern "C" {
#include "libavutil/mathematics.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include <ao/ao.h>
}
void die(const char *msg)
{
fprintf(stderr,"%s\n",msg);
exit(1);
}
int main(int argc, char **argv)
{
const char* input_filename=argv[1];
//avcodec_register_all();
av_register_all();
//av_ini
AVFormatContext* container=avformat_alloc_context();
if(avformat_open_input(&container,input_filename,NULL,NULL)<0){
die("Could not open file");
}
if(av_find_stream_info(container)<0){
die("Could not find file info");
}
av_dump_format(container,0,input_filename,false);
int stream_id=-1;
int i;
for(i=0;i<container->nb_streams;i++){
if(container->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
stream_id=i;
break;
}
}
if(stream_id==-1){
die("Could not find Audio Stream");
}
AVDictionary *metadata=container->metadata;
AVCodecContext *ctx=container->streams[stream_id]->codec;
AVCodec *codec=avcodec_find_decoder(ctx->codec_id);
if(codec==NULL){
die("cannot find codec!");
}
if(avcodec_open(ctx,codec)<0){
die("Codec cannot be found");
}
//ctx=avcodec_alloc_context3(codec);
//initialize AO lib
ao_initialize();
int driver=ao_default_driver_id();
ao_sample_format sformat;
sformat.bits=16;
sformat.channels=2;
sformat.rate=44100;
sformat.byte_format=AO_FMT_NATIVE;
sformat.matrix=0;
ao_device *adevice=ao_open_live(driver,&sformat,NULL);
//end of init AO LIB
AVPacket packet;
av_init_packet(&packet);
AVFrame *frame=avcodec_alloc_frame();
int buffer_size=AVCODEC_MAX_AUDIO_FRAME_SIZE;
uint8_t buffer[buffer_size];
packet.data=buffer;
packet.size =buffer_size;
int len;
int frameFinished=0;
while(av_read_frame(container,&packet)>=0)
{
if(packet.stream_index==stream_id){
//printf("Audio Frame read \n");
int len=avcodec_decode_audio4(ctx,frame,&frameFinished,&packet);
//frame->
if(frameFinished){
//printf("Finished reading Frame %d %d\n",packet.size,len);
ao_play(adevice, (char*)frame->data, len);
}
}
}
av_close_input_file(container);
ao_shutdown();
return 0;
}
tôi đã thêm hỗ trợ âm thanh phẳng, mã là ở đây http://0xdeafc0de.wordpress.com/2013/12/19/ffmpeg- audio-playback-sample/ –
@MaduraAnushanga oh bạn cũng đến từ sri lanka :) –
Tôi cũng vậy :) bạn cũng thế? Họ của bạn có vẻ kỳ quặc ... –