您的位置:首页 > 移动开发 > Android开发

Android ffmpeg解码后的音频帧保存为pcm数据

2019-05-06 09:56 295 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/baidu_41666295/article/details/89875031

1.首先要解码每一帧数据,判断是否为音频帧
// 循环读取一帧视频
while (av_read_frame(fmt_ctx, &avPacket) >= 0) {
//判断是否为视频流
if (avPacket.stream_index == videoStream->index) {
LOGE(“AVStream is VideoStream”);
got_frame = 0;
//对该帧进行解码
ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &avPacket);
if (ret < 0) {
LOGE(“Error decoding video\n ret=%d”, ret);
break;
}
if (got_frame) {
av_frame_unref(filt_frame);
}

}else if(avPacket.stream_index==audioStream->index){ //音频流
LOGE("AVStream is AudioStream");
got_frame = 0;
encode_audio(env,&avPacket,frame);
}
av_frame_unref(frame);
av_packet_unref(&avPacket);
}
  1. 从音频帧取出音频原始数据
    int encode_audio(JNIEnv * env, AVPacket* packet, AVFrame* frame){
    //解码
    int ret = avcodec_decode_audio4(audioCodecCtx, frame, &got_frame, packet);
    if(ret < 0){
    LOGE(“avcodec_decode_audio4 failed”);
    return ret;
    }
    //解码一帧成功
    if(got_frame)
    // 获取一个采样点字节数,比如16位采样点值为2字节
    int data_size = av_get_bytes_per_sample(audioCodecCtx->sample_fmt);
    // 音频数据写成pcm文件
    if (frame->data[0] && frame->data[1]) {
    LOGE(“frame.data[1]”);
    for (int i = 0; i < audioCodecCtx->frame_size; i++)
    {
    fwrite(frame->data[0] + i * data_size, 1, data_size, file_pcm);
    fwrite(frame->data[1] + i * data_size, 1, data_size, file_pcm);
    }
    }else if(frame->data[0]) {
    LOGE(“frame.data[0]”);
    fwrite(frame->data[0], 1, frame->linesize[0],file_pcm);
    }
    }
    return 0;
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: