首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟用VC6.0跟C语言开发的播放器,但是播放没声音

2013-08-11 
小弟用VC6.0和C语言开发的播放器,但是播放没声音。如题,我写的播放器中,用到了FFMPEG和SDL来开发,现在只是

小弟用VC6.0和C语言开发的播放器,但是播放没声音。
如题,我写的播放器中,用到了FFMPEG和SDL来开发,现在只是一个播放器,但是无论怎样,都没播放出声音,运行也没出错,由于小弟第一次做播放器,所以可能缺了一些步骤,望各位高人智点一下
小弟用VC6.0跟C语言开发的播放器,但是播放没声音

#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"

#include "libsdl/SDL.h"
#include "libsdl/SDL_thread.h"

#include <stdio.h>
#include <string.h>

#if defined __MINGW32__ || defined WIN32
#undef main /* Prevents SDL from overriding main() */
#endif

#define SDL_AUDIO_BUFFER_SIZE 1024

typedef struct PacketQueue{
AVPacketList *first_pkt,*last_pkt;
int nb_packets;
int size;
SDL_mutex *mutex;
SDL_cond *cond;
}PacketQueue;

PacketQueue audioq;

int quit = 0;

void packet_queue_init(PacketQueue *q){
memset(q,0,sizeof(PacketQueue));
q->mutex = SDL_CreateMutex();
q->cond = SDL_CreateCond();
}

int packet_queue_put(PacketQueue *q,AVPacket *pkt){
AVPacketList *pkt1;
if(av_dup_packet(pkt)<0)
return - 1;
pkt1 = av_malloc(sizeof(AVPacketList));
if(!pkt1){
puts("Warning:memory malloc fail!");
return -1;
}
pkt1->pkt = *pkt;
pkt1->next = NULL;

SDL_LockMutex(q->mutex);

if(!q->last_pkt)
q->first_pkt = pkt1;
else
q->last_pkt->next = pkt1;
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size;
SDL_CondSignal(q->cond);
SDL_UnlockMutex(q->mutex);
return 0;
}

static int packet_queue_get(PacketQueue *q,AVPacket *pkt,int block){
AVPacketList *pkt1;
int ret;

SDL_LockMutex(q->mutex);

for(;;){
if(quit){
ret = -1;
break;
}

pkt1 = q->first_pkt;
if(pkt1){
q->first_pkt = pkt1->next;
if(!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size;
*pkt = pkt1->pkt;
av_free(pkt1);
ret = 1;
break;
}
else
if(!block){
ret = 0;
break;
}
else{
SDL_CondWait(q->cond,q->mutex);
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}

int audio_decode_frame(AVCodecContext *aCodecCtx,uint8_t *audio_buf,int buf_size){


static AVPacket pkt;
static uint8_t *audio_pkt_data = NULL;
static int audio_pkt_size = 0;

int len1,data_size;

for(;;){
while(audio_pkt_size>0){
data_size = buf_size;
len1 = avcodec_decode_audio2(aCodecCtx,(int16_t *)audio_buf,
&data_size,audio_pkt_data,audio_pkt_size);
if(len1<0){
audio_pkt_size = 0;
break;
}
audio_pkt_data += len1;
audio_pkt_size -=len1;
if(data_size<=0){
continue;
}
data_size /=3;
return data_size;
}
if(pkt.data){
av_free_packet(&pkt);
}

if(quit){
return -1;
}

if(packet_queue_get(&audioq,&pkt,1)<0){
return -1;
}

audio_pkt_data = pkt.data;
audio_pkt_size = pkt.size;
}
}

void audio_callback(void *userdata,Uint8 *stream,int len){
AVCodecContext *aCodecCtx = (AVCodecContext *)userdata;
int len1,audio_size;

static uint8_t audio_buf[( AVCODEC_MAX_AUDIO_FRAME_SIZE * 3 ) / 2];
static unsigned int audio_buf_size = 0;
static unsigned int audio_buf_index = 0;

while(len>0){
if(audio_buf_index >= audio_buf_size){
audio_size = audio_decode_frame(aCodecCtx,audio_buf,sizeof(audio_buf));
if(audio_size<0){
audio_buf_size = 1024;
memset(audio_buf,0,audio_buf_size);
}
else{
audio_buf_size = audio_size;
}
audio_buf_index = 0;
}
len1 = audio_buf_size - audio_buf_index;
if(len1>len)
len1 = len;
memcpy(stream,(uint8_t *)audio_buf + audio_buf_index,len1);
len -=len1;
stream +=len1;
audio_buf_index +=len1;
}
}

int main()
{
AVFormatContext *pFormatCtx;
int i,audioStream;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVPacket packet;
float aspect_ratio;

AVCodecContext *aCodecCtx;
AVCodec *aCodec;

SDL_Event event;
SDL_AudioSpec wanted_spec,spec;

char songs[] = "D:\\2.mp3";

//Register
av_register_all();

if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
{
puts("Could not initialize SDL!");
return 1;
}

if(av_open_input_file(&pFormatCtx,songs,NULL,0,NULL)!=0)


{
puts("Could not open song file!");
return -1;
}
//puts("success!");

if(av_find_stream_info(pFormatCtx)<0)
{
puts("Couldn't find stream information!");
return -1;
}

dump_format(pFormatCtx,0,songs,0);

audioStream = -1;
for(i = 0; i < pFormatCtx->nb_streams;i++){
if( pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO && audioStream<0 ){
audioStream = i;
}
}

if(audioStream==-1)
return -1;

//保存音频流的编解码信息,通过它获取特定的解码器并使用它
aCodecCtx = pFormatCtx->streams[audioStream]->codec;

wanted_spec.freq = aCodecCtx->sample_rate;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.channels = 2;//aCodecCtx->channels;
wanted_spec.silence = 0;
wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
wanted_spec.callback = audio_callback;
wanted_spec.userdata = aCodecCtx;

if(SDL_OpenAudio(&wanted_spec,&spec)<0){
puts("SDL_OpenAudio errors!");
return -1;
}

aCodec = avcodec_find_decoder(aCodecCtx->codec_id);
if(!aCodec){
puts("Unsupported codec!");
return -1;
}

avcodec_open(aCodecCtx,aCodec);
packet_queue_init(&audioq);
SDL_PauseAudio(0);
SDL_CloseAudio();

    av_close_input_file(pFormatCtx);
    getchar();
return 0;
}

播放器?FFMPEG?SDL?C
[解决办法]
首先确定ffmpeg能播放声音
其下应该有类似player的console程序

在确定库没有问题的情况下,便可确定是否你写的代码有问题。

热点排行