既有适合小白学习的零基础资料,也有适合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