以下是我自己写的小demo
#include <errno.h>
#include <android/log.h>
#include <libavutil/avutil.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
AVFormatContext *fmt_ctx=NULL;
AVCodecContext *codec_ctx;
AVCodec *codec;
AVPacket packet;
AVFrame *frame;
int frame_ptr;
void mylog(const char * fmt, ...);
void Java_com_test_multi_MultiPlayerActivity_test(){
avcodec_register_all();
av_register_all();
if(avformat_open_input(&fmt_ctx,"/sdcard/wma",NULL,NULL)!=0)
{mylog("errno %d",errno);}
if(avformat_find_stream_info(fmt_ctx,NULL)<0)
{mylog("errno %d",errno);}
codec_ctx=fmt_ctx->streams[0]->codec;
codec = avcodec_find_decoder(codec_ctx->codec_id);
mylog("id=%d",codec->id);
if (avcodec_open2(codec_ctx, codec,NULL) < 0)
{mylog("errno %d",errno);}
while(av_read_frame(fmt_ctx,&packet)==0){
frame=avcodec_alloc_frame();
avcodec_decode_audio4(codec_ctx, frame, &frame_ptr,&packet);
mylog("frame_ptr %d",frame_ptr);
if(frame_ptr){
int data_size = av_samples_get_buffer_size(frame->linesize,codec_ctx->channels,frame->nb_samples,codec_ctx->sample_fmt, 0);
mylog("data count %d",data_size);
/*int i=0;
for(;i<data_size;++i){
mylog("data %d",(frame->data[0])[i]);
}*/
}
av_free_packet(&packet);
}
avformat_close_input(&fmt_ctx);
}
void mylog(const char* fmt,...){
va_list arg_ptr;
va_start(arg_ptr, fmt);
__android_log_vprint(ANDROID_LOG_ERROR, "multi",fmt, arg_ptr);
}
1622

被折叠的 条评论
为什么被折叠?



