8
मैं ऑडियो फ़ाइलों को डीकोड करने के लिए निम्नलिखित कोड स्निपेट का उपयोग करता हूं (एमपी 3, डब्ल्यूएवी, डब्लूएमवी के साथ परीक्षण)।libavcodec का उपयोग करके ऑडियो डीकोड करें और libAO का उपयोग करके खेलते हैं?
लेकिन जब यह ऑडियो चलाता है, तो यह समय-समय पर स्थिर ध्वनियां और क्रैश देता है। क्या मैं यहां गलत कर रहा हूं पर कोई संकेत?
#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;
}
मैं प्लानर ऑडियो समर्थन जोड़ा, कोड यहाँ है http://0xdeafc0de.wordpress.com/2013/12/19/ffmpeg- ऑडियो-प्लेबैक-नमूना/ –
@ मदुरा अनावुंगा ओह आप श्री लंका से भी हैं :) –
यूप मैं हूं :) आप भी हैं? आपका अंतिम नाम अजीब लगता है ... –