最全Android使用FFmpeg播放音频_qt 安卓ffmpeg avcodec模块不能识别,含泪整理面经

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

//初始化SwrContext
swr\_init(swr_cxt);
//重采样设置选项-----------------------------------------------------------end
//获取输出的声道个数
int out_channel_nb = av\_get\_channel\_layout\_nb\_channels(out_ch_layout);
jclass clazz = env->GetObjectClass(instance);
//调用Java方法MethodID
jmethodID methodId = env->GetMethodID(clazz,"createTrack","(II)V");
jmethodID methodID1 = env->GetMethodID(clazz,"playTrack","([BI)V");
//通过methodId调用Java方法
env->CallVoidMethod(instance,methodId,44100,out_channel_nb);
//存储pcm数据
uint8_t \*out_buf = (uint8_t\*)av\_malloc(2\*44100);
int got_frame, frame_count = 0;
//6.一帧一帧读取压缩的音频数据AVPacket
int ret;
while(av\_read\_frame(pFormatContext,avp) >= 0){
    if(avp->stream_index == audio_index){
        //解码从avpacket到avframe
        ret = avcodec\_decode\_audio4(pCodecContext,avf,&got_frame,avp);
        // =0 表示解码完成
        if(ret < 0){
            av\_log(NULL,AV_LOG_INFO,"解码完成 \n");
        }
        //表示正在解码
        if(got_frame != 0){
            LOGE("正在解码第%d帧 \n",++frame_count);
            swr\_convert(swr_cxt , &out_buf , 2 \* 44100 , (const uint8_t \*\*)avf->data , avf->nb_samples);
            //获取sample的size
            int out_buf_size = av\_samples\_get\_buffer\_size(NULL,out_channel_nb,avf->nb_samples,out_sample_fmt,1);
            jbyteArray audioArray = env->NewByteArray(out_buf_size);
            env->SetByteArrayRegion(audioArray,0,out_buf_size,(const jbyte\*)out_buf);
            //调用Java方法 把解码后的数据(audioArray)给AudioTrack进行播放
            env->CallVoidMethod(instance,methodID1,audioArray,out_buf_size);
            env->DeleteLocalRef(audioArray);
        }
    }
    av\_packet\_unref(avp);
}
av\_frame\_free(&avf);
swr\_free(&swr_cxt);
avcodec\_close(pCodecContext);
avforma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值