ffmpeg for android 零基础学习音视频开发 07 之 ffmpeg 从 MP4中抽取音频数据

    技术2022-07-10  135

    #编译文件 gcc -g -o getacc b.cpp -lavformat -lavcodec -lpthread -lm -lz -lavutil -lstdc++ #输出h264文件 ./geth264 xxx.mp4 xxx.acc #include <exception> #include <iostream> extern "C" { #include <stdio.h> #include <libavformat/avformat.h> } av_always_inline char* wrap_av_err2str(int errnum) { static char str[AV_ERROR_MAX_STRING_SIZE]; memset(str, 0, sizeof(str)); return av_make_error_string(str, AV_ERROR_MAX_STRING_SIZE, errnum); } int main(int argc,char *argv[]) { int ret = 0; int jumpNumber; AVPacket pkt; char* src = NULL; char* dst = NULL; int audio_index,len; FILE* dst_fd = NULL; src = argv[1]; dst = argv[2]; AVFormatContext *fmt_ctx = NULL; if(argc < 3 || !src || !dst){ jumpNumber = -1; goto __END; } av_log_set_level(AV_LOG_INFO); av_register_all(); //read stream std::cout <<"将要打开的文件:"<< src << ",输出的文件:" << dst << " \n"; ret = avformat_open_input(&fmt_ctx, src, NULL, NULL);//参数为上下文 文件路 径 文件格式 命令行参数 if(ret < 0){ jumpNumber = -2; goto __END; } dst_fd = fopen(dst, "wb"); if(!dst_fd) { jumpNumber = -3; goto __END; } av_dump_format(fmt_ctx, 0, src,0); //getStream 得到流地址 ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0); if(ret < 0){ jumpNumber = -4; goto __END; } //获取数据包 audio_index = ret; av_init_packet(&pkt); while(av_read_frame(fmt_ctx, &pkt) >= 0){ if(pkt.stream_index == audio_index){//pkt就是数据包对象。 len = fwrite(pkt.data,1, pkt.size, dst_fd); if(len != pkt.size){ jumpNumber = -5; av_log(NULL,AV_LOG_WARNING,"warning ,length of data isn't equal size of pkt \n"); } } av_packet_unref(&pkt);//释放空间i } __END: switch(jumpNumber){ case -1: av_log(NULL,AV_LOG_ERROR,"input params error\n");break; case -2: av_log(NULL,AV_LOG_ERROR,"Can't open file: %s \n",wrap_av_err2str(ret));break; case -3: av_log(NULL,AV_LOG_ERROR,"Can't open out file \n");break; case -4: av_log(NULL,AV_LOG_ERROR,"can't find the best stream\n");break; } try{//释放内存 avformat_close_input(&fmt_ctx); fclose(dst_fd); }catch(...){} return ret; }
    Processed: 0.012, SQL: 9