FFmpeg合成h264视频流和aac音频流为mp4

来源:互联网 发布:js去除disabled属性 编辑:程序博客网 时间:2024/05/16 19:54

#include "MyMuxerToMP4.h"

#include <stdio.h>#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>/* FIX: H.264 in some container format (FLV, MP4, MKV etc.) need "h264_mp4toannexb" bitstream filter (BSF) *Add SPS,PPS in front of IDR frame *Add start code ("0,0,0,1") in front of NALU H.264 in some container (MPEG2TS) don't need this BSF. *///'1': Use H.264 Bitstream Filter#define USE_H264BSF 1/* FIX:AAC in some container format (FLV, MP4, MKV etc.) need "aac_adtstoasc" bitstream filter (BSF) *///'1': Use AAC Bitstream Filter#define USE_AACBSF 1////static int open_input_file(const char *filename)//{//    int ret;//    AVCodec *dec;//    //    if ((ret = avformat_open_input(&pFormatCtx, filename, NULL, NULL)) < 0) {//        printf( "Cannot open input file\n");//        return ret;//    }//    //    if ((ret = avformat_find_stream_info(pFormatCtx, NULL)) < 0) {//        printf( "Cannot find stream information\n");//        return ret;//    }//    //    /* select the video stream *///    ret = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0);//    if (ret < 0) {//        printf( "Cannot find a video stream in the input file\n");//        return ret;//    }//    video_stream_index = ret;//    pCodecCtx = pFormatCtx->streams[video_stream_index]->codec;//    //    /* init the video decoder *///    if ((ret = avcodec_open2(pCodecCtx, dec, NULL)) < 0) {//        printf( "Cannot open video decoder\n");//        return ret;//    }//    //    return 0;//}int muxer_main(char *inputH264FileName,char *inputAacFileName,char *outMP4FileName){    AVOutputFormat *ofmt =NULL;    //Input AVFormatContext and Output AVFormatContext    AVFormatContext *ifmt_ctx_v =NULL, *ifmt_ctx_a =NULL,*ofmt_ctx = NULL;    AVPacket pkt;    AVCodec *dec;   int ret, i;   int videoindex_v=-1,videoindex_out=-1;   int audioindex_a=-1,audioindex_out=-1;   int frame_index=0;    int64_t cur_pts_v=0,cur_pts_a=0;        //const char *in_filename_v = "cuc_ieschool.ts";//Input file URL   constchar *in_filename_v =inputH264FileName;    //const char *in_filename_a = "cuc_ieschool.mp3";    //const char *in_filename_a = "gowest.m4a";    //const char *in_filename_a = "gowest.aac";   constchar *in_filename_a =inputAacFileName;       constchar *out_filename =outMP4FileName;//Output file URL        printf("==========in h264==filename:%s\n",in_filename_v);    printf("==========in aac ===filename:%s\n",in_filename_a);    printf("==========outfile:%s\n",out_filename);    avcodec_register_all();    av_register_all();    //Input   if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a,NULL,NULL)) <0) {//        printf("=====11========RET:%d\n",ret);        printf( "Could not open input file.");       goto end;    }//    printf("=====2========RET:%d\n",ret);   if ((ret = avformat_find_stream_info(ifmt_ctx_a,0)) <0) {        printf( "Failed to retrieve input stream information");       goto end;    }           if ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v,NULL,NULL)) <0) {        printf( "Could not open input file:%d\n",ret);       goto end;    }//    printf("=====0========RET:%d\n",ret);   if ((ret = avformat_find_stream_info(ifmt_ctx_v,0)) <0) {        printf( "Failed to retrieve input stream information");       goto end;    }    //    /* init the video decoder *///    if ((ret = avcodec_open2(ifmt_ctx_a->, dec, NULL)) < 0) {//        printf( "Cannot open video decoder\n");//        return ret;//    }//           printf("===========Input Information==========\n");    av_dump_format(ifmt_ctx_v,0, in_filename_v,0);    av_dump_format(ifmt_ctx_a,0, in_filename_a,0);    printf("======================================\n");    //Output    avformat_alloc_output_context2(&ofmt_ctx,NULL,NULL, out_filename);   if (!ofmt_ctx) {        printf( "Could not create output context\n");        ret = AVERROR_UNKNOWN;       goto end;    }    ofmt = ofmt_ctx->oformat;       for (i =0; i < ifmt_ctx_v->nb_streams; i++) {        //Create output AVStream according to input AVStream       if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){            AVStream *in_stream = ifmt_ctx_v->streams[i];            AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);            videoindex_v=i;           if (!out_stream) {                printf( "Failed allocating output stream\n");                ret = AVERROR_UNKNOWN;               goto end;            }            videoindex_out=out_stream->index;            //Copy the settings of AVCodecContext            ret =av_dict_set(&out_stream->metadata,"rotate","90",0);//设置旋转角度           if(ret>=0)            {                printf("=========yes=====set rotate success!===\n");            }                       if (avcodec_copy_context(out_stream->codec, in_stream->codec) <0) {                printf("Failed to copy context from input to output stream codec context\n");               goto end;            }            out_stream->codec->codec_tag =0;           if (ofmt_ctx->oformat->flags &AVFMT_GLOBALHEADER)                out_stream->codec->flags |=CODEC_FLAG_GLOBAL_HEADER;           break;        }    }       for (i =0; i < ifmt_ctx_a->nb_streams; i++) {        //Create output AVStream according to input AVStream       if(ifmt_ctx_a->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){           AVStream *in_stream = ifmt_ctx_a->streams[i];           AVStream *out_stream =avformat_new_stream(ofmt_ctx, in_stream->codec->codec);            audioindex_a=i;           if (!out_stream) {                printf( "Failed allocating output stream\n");                ret = AVERROR_UNKNOWN;               goto end;            }            audioindex_out=out_stream->index;            //Copy the settings of AVCodecContext           if (avcodec_copy_context(out_stream->codec, in_stream->codec) <0) {                printf( "Failed to copy context from input to output stream codec context\n");               goto end;            }            out_stream->codec->codec_tag =0;           if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)                out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;                       break;        }    }        printf("==========Output Information==========\n");    av_dump_format(ofmt_ctx,0, out_filename,1);    printf("======================================\n");    //Open output file   if (!(ofmt->flags & AVFMT_NOFILE)) {       if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) <0) {            printf("Could not open output file '%s'", out_filename);           goto end;        }    }    //Write file header   if (avformat_write_header(ofmt_ctx,NULL) < 0) {        printf( "Error occurred when opening output file\n");       goto end;    }            //FIX#if USE_H264BSF    AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb");#endif#if USE_AACBSF    AVBitStreamFilterContext* aacbsfc =  av_bitstream_filter_init("aac_adtstoasc");#endif       while (1) {        AVFormatContext *ifmt_ctx;       int stream_index=0;        AVStream *in_stream, *out_stream;                //Get an AVPacket       if(av_compare_ts(cur_pts_v,ifmt_ctx_v->streams[videoindex_v]->time_base,cur_pts_a,ifmt_ctx_a->streams[audioindex_a]->time_base) <=0){            ifmt_ctx=ifmt_ctx_v;            stream_index=videoindex_out;                       if(av_read_frame(ifmt_ctx, &pkt) >=0){               do{                    in_stream  = ifmt_ctx->streams[pkt.stream_index];                    out_stream = ofmt_ctx->streams[stream_index];                                       if(pkt.stream_index==videoindex_v){                        //FIX£∫No PTS (Example: Raw H.264)                       //Simple Write PTS                       if(pkt.pts==AV_NOPTS_VALUE){                           //Write PTS                            AVRational time_base1=in_stream->time_base;                            //Duration between 2 frames (us)                            int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);                           //Parameters                            pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            pkt.dts=pkt.pts;                            pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            frame_index++;                        }                                                cur_pts_v=pkt.pts;                       break;                    }                }while(av_read_frame(ifmt_ctx, &pkt) >=0);            }else{               break;            }        }else{            ifmt_ctx=ifmt_ctx_a;            stream_index=audioindex_out;           if(av_read_frame(ifmt_ctx, &pkt) >=0){               do{                    in_stream  = ifmt_ctx->streams[pkt.stream_index];                    out_stream = ofmt_ctx->streams[stream_index];                                       if(pkt.stream_index==audioindex_a){                                               //FIX£∫No PTS                       //Simple Write PTS                       if(pkt.pts==AV_NOPTS_VALUE){                           //Write PTS                            AVRational time_base1=in_stream->time_base;                            //Duration between 2 frames (us)                            int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);                           //Parameters                            pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            pkt.dts=pkt.pts;                            pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            frame_index++;                        }                        cur_pts_a=pkt.pts;                                               break;                    }                }while(av_read_frame(ifmt_ctx, &pkt) >=0);            }else{               break;            }                    }                //FIX:Bitstream Filter#if USE_H264BSF        av_bitstream_filter_filter(h264bsfc, in_stream->codec,NULL, &pkt.data, &pkt.size, pkt.data, pkt.size,0);#endif#if USE_AACBSF        av_bitstream_filter_filter(aacbsfc, out_stream->codec,NULL, &pkt.data, &pkt.size, pkt.data, pkt.size,0);#endif                        //Convert PTS/DTS        pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));        pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));                pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);        pkt.pos = -1;        pkt.stream_index=stream_index;                printf("Write 1 Packet. size:%5d\tpts:%lld\n",pkt.size,pkt.pts);       //Write       if (av_interleaved_write_frame(ofmt_ctx, &pkt) <0) {            printf( "Error muxing packet\n");           break;        }        av_free_packet(&pkt);            }    //Write file trailer    av_write_trailer(ofmt_ctx);    #if USE_H264BSF    av_bitstream_filter_close(h264bsfc);#endif#if USE_AACBSF    av_bitstream_filter_close(aacbsfc);#endif    end:    avformat_close_input(&ifmt_ctx_v);    avformat_close_input(&ifmt_ctx_a);    /* close output */   if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))        avio_close(ofmt_ctx->pb);    avformat_free_context(ofmt_ctx);   if (ret <0 && ret != AVERROR_EOF) {        printf( "Error occurred.\n");       return -1;    }        printf("======muxer mp4 success =====!\n");   return0;}


//==========2016年12月22日修改如下==================


因为按照上面的代码,一般的视频(如果aac不为空,也就是音频是有的话)是没有问题,但是如果aac是空文件,length=0,那合成就出问题!


于是解决这个问题,总代码如下:

////  MyMuxerToMP4.c//  SFFmpegIOSTranscoder////  Created by lunil on 16/1/18.//  Copyright © 2016年 Lei Xiaohua. All rights reserved.//#include "MyMuxerToMP4.h"#include <stdio.h>#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <stdlib.h>/* FIX: H.264 in some container format (FLV, MP4, MKV etc.) need "h264_mp4toannexb" bitstream filter (BSF) *Add SPS,PPS in front of IDR frame *Add start code ("0,0,0,1") in front of NALU H.264 in some container (MPEG2TS) don't need this BSF. *///'1': Use H.264 Bitstream Filter#define USE_H264BSF 1/* FIX:AAC in some container format (FLV, MP4, MKV etc.) need "aac_adtstoasc" bitstream filter (BSF) *///'1': Use AAC Bitstream Filter#define USE_AACBSF 1static int open_input_file(const char *filename){    FILE *fp;    fp=fopen(filename,"rb");// localfile文件名    fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */    int flen=ftell(fp); /* 得到文件大小 */    //printf("=====22222======filename %s,length:%d",filename,flen);        return flen;}int muxer_main(char *inputH264FileName,char *inputAacFileName,char *outMP4FileName,char* angle){    AVOutputFormat *ofmt = NULL;    //Input AVFormatContext and Output AVFormatContext    AVFormatContext *ifmt_ctx_v = NULL, *ifmt_ctx_a = NULL,*ofmt_ctx = NULL;    AVPacket pkt;    AVCodec *dec;    int ret, i;    int videoindex_v=-1,videoindex_out=-1;    int audioindex_a=-1,audioindex_out=-1;    int frame_index=0;    int64_t cur_pts_v=0,cur_pts_a=0;        //const char *in_filename_v = "cuc_ieschool.ts";//Input file URL    const char *in_filename_v =inputH264FileName;    //const char *in_filename_a = "cuc_ieschool.mp3";    //const char *in_filename_a = "gowest.m4a";    //const char *in_filename_a = "gowest.aac";    const char *in_filename_a =inputAacFileName;        const char *out_filename =outMP4FileName;//Output file URL        printf("==========in h264==filename:%s\n",in_filename_v);    printf("==========in aac ===filename:%s\n",in_filename_a);            //int video_length=open_input_file(in_filename_v);    //=========判断如果视频中没有音频,会导致avformat_find_stream_info退出程序======    int acc_length=open_input_file(in_filename_a); //如果音频是空,则不需要放入视频    avcodec_register_all();    av_register_all();        //Input    if ((ret = avformat_open_input(&ifmt_ctx_a, in_filename_a, NULL, NULL)) < 0) {        //        printf("=====11========RET:%d\n",ret);        printf( "Could not open input file.");        goto end;    }    //    printf("=====2========RET:%d\n",ret);    if ((ret = avformat_find_stream_info(ifmt_ctx_a, 0)) < 0) {        printf( "Failed to retrieve input stream information");        if(acc_length>0) //如果音频是空,则直接到结尾,否则继续运行            goto end;    }        if ((ret = avformat_open_input(&ifmt_ctx_v, in_filename_v, NULL, NULL)) < 0) {        printf( "Could not open input file:%d\n",ret);        goto end;    }    //    printf("=====0========RET:%d\n",ret);    if ((ret = avformat_find_stream_info(ifmt_ctx_v, 0)) < 0) {        printf( "Failed to retrieve input stream information");        goto end;    }        //    /* init the video decoder */    //    if ((ret = avcodec_open2(ifmt_ctx_a->, dec, NULL)) < 0) {    //        printf( "Cannot open video decoder\n");    //        return ret;    //    }    //            printf("===========Input Information==========\n");    av_dump_format(ifmt_ctx_v, 0, in_filename_v, 0);    av_dump_format(ifmt_ctx_a, 0, in_filename_a, 0);    printf("======================================\n");    //Output    avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);    if (!ofmt_ctx) {        printf( "Could not create output context\n");        ret = AVERROR_UNKNOWN;        goto end;    }    ofmt = ofmt_ctx->oformat;        for (i = 0; i < ifmt_ctx_v->nb_streams; i++) {        //Create output AVStream according to input AVStream        if(ifmt_ctx_v->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){            AVStream *in_stream = ifmt_ctx_v->streams[i];            AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);            videoindex_v=i;            if (!out_stream) {                printf( "Failed allocating output stream\n");                ret = AVERROR_UNKNOWN;                goto end;            }            videoindex_out=out_stream->index;            //Copy the settings of AVCodecContext            ret = av_dict_set(&out_stream->metadata,"rotate",angle,0); //设置旋转角度            if(ret>=0)            {                printf("=========yes=====set rotate success!===:%s\n",angle);            }                        if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {                printf( "Failed to copy context from input to output stream codec context\n");                goto end;            }            out_stream->codec->codec_tag = 0;            if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)                out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;            break;        }    }        if(acc_length>0) //如果音频文件有内容,则读取,否则为空读取会失败    {        for (i = 0; i < ifmt_ctx_a->nb_streams; i++) {                        printf("===========acc=====from======:%d\n",ifmt_ctx_a->nb_streams);            //Create output AVStream according to input AVStream            if(ifmt_ctx_a->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){                AVStream *in_stream = ifmt_ctx_a->streams[i];                AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);                audioindex_a=i;                if (!out_stream) {                    printf( "Failed allocating output stream\n");                    ret = AVERROR_UNKNOWN;                    goto end;                }                audioindex_out=out_stream->index;                //Copy the settings of AVCodecContext                if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {                    printf( "Failed to copy context from input to output stream codec context\n");                    goto end;                }                out_stream->codec->codec_tag = 0;                if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)                    out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;                                break;            }        }    }        printf("==========Output Information==========\n");    av_dump_format(ofmt_ctx, 0, out_filename, 1);    printf("======================================\n");    //Open output file    if (!(ofmt->flags & AVFMT_NOFILE)) {        if (avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE) < 0) {            printf( "Could not open output file '%s'", out_filename);            goto end;        }    }                //Write file header    int header_ret=avformat_write_header(ofmt_ctx, NULL);    if (header_ret< 0) {        printf( "Error occurred when opening output file:%d\n",header_ret);        goto end;    }            //FIX#if USE_H264BSF    AVBitStreamFilterContext* h264bsfc =  av_bitstream_filter_init("h264_mp4toannexb");#endif#if USE_AACBSF    AVBitStreamFilterContext* aacbsfc =  av_bitstream_filter_init("aac_adtstoasc");#endif        while (1) {        AVFormatContext *ifmt_ctx;        int stream_index=0;        AVStream *in_stream, *out_stream;                        //Get an AVPacket                int compare_tag=-1;        if(acc_length>0) //既然没有音频,则直接判断写入视频        {            compare_tag =av_compare_ts(cur_pts_v,ifmt_ctx_v->streams[videoindex_v]->time_base,cur_pts_a,ifmt_ctx_a->streams[audioindex_a]->time_base) ;        }                if(compare_tag<= 0){            ifmt_ctx=ifmt_ctx_v;            stream_index=videoindex_out;                        if(av_read_frame(ifmt_ctx, &pkt) >= 0){                do{                    in_stream  = ifmt_ctx->streams[pkt.stream_index];                    out_stream = ofmt_ctx->streams[stream_index];                                        if(pkt.stream_index==videoindex_v){                        //FIX£∫No PTS (Example: Raw H.264)                        //Simple Write PTS                        if(pkt.pts==AV_NOPTS_VALUE){                            //Write PTS                            AVRational time_base1=in_stream->time_base;                            //Duration between 2 frames (us)                            int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);                            //Parameters                            pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            pkt.dts=pkt.pts;                            pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            frame_index++;                        }                                                cur_pts_v=pkt.pts;                        break;                    }                }while(av_read_frame(ifmt_ctx, &pkt) >= 0);            }else{                break;            }        }else{            ifmt_ctx=ifmt_ctx_a;            stream_index=audioindex_out;            if(av_read_frame(ifmt_ctx, &pkt) >= 0){                do{                    in_stream  = ifmt_ctx->streams[pkt.stream_index];                    out_stream = ofmt_ctx->streams[stream_index];                                        if(pkt.stream_index==audioindex_a){                                                //FIX£∫No PTS                        //Simple Write PTS                        if(pkt.pts==AV_NOPTS_VALUE){                            //Write PTS                            AVRational time_base1=in_stream->time_base;                            //Duration between 2 frames (us)                            int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);                            //Parameters                            pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            pkt.dts=pkt.pts;                            pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);                            frame_index++;                        }                        cur_pts_a=pkt.pts;                                                break;                    }                }while(av_read_frame(ifmt_ctx, &pkt) >= 0);            }else{                break;            }                    }                //FIX:Bitstream Filter#if USE_H264BSF        av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);#endif#if USE_AACBSF        av_bitstream_filter_filter(aacbsfc, out_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);#endif                        //Convert PTS/DTS        pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));        pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));                pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);        pkt.pos = -1;        pkt.stream_index=stream_index;                printf("Write 1 Packet. size:%5d\tpts:%lld\n",pkt.size,pkt.pts);        //Write                if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {            printf( "Error muxing packet\n");            break;        }                        av_free_packet(&pkt);            }    //Write file trailer    av_write_trailer(ofmt_ctx);    #if USE_H264BSF    av_bitstream_filter_close(h264bsfc);#endif#if USE_AACBSF    av_bitstream_filter_close(aacbsfc);#endif    end:    avformat_close_input(&ifmt_ctx_v);    avformat_close_input(&ifmt_ctx_a);    /* close output */    if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))        avio_close(ofmt_ctx->pb);    avformat_free_context(ofmt_ctx);    if (ret < 0 && ret != AVERROR_EOF) {        printf( "Error occurred.\n");        return -1;    }        printf("======muxer mp4 success =====!\n");    return 0;}


解决方案就是先判断文件是不是空的,然后只把视频封装进mp4容器即可。会有一些警告,但是完全ok!





1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办 千牛聊天页面买家信息不显示怎么办 秒拍存草稿箱的视频没了怎么办? 登录山东掌厅出现服务器错误怎么办 微信号被多人投诉被限制登录怎么办 联想平板电脑开机密码忘记了怎么办 申请的qq没登录忘了账号怎么办 炫舞时代由于网络原因登不上怎么办 qq申请太多进不了热聊怎么办 手机号申请的微信号被盗了怎么办 买菜别人少找了钱不还怎么办 在掌上英雄联盟买皮肤买错区怎么办 win8我的电脑图标没了怎么办 英雄联盟老是卡在安全扫描怎么办 英雄联盟活动送皮肤没送怎么办 电脑换完系统有些页面打不开怎么办 王卡助手交手机费页面打不开怎么办 在浏览器上打不开路由器页面怎么办 英雄联盟读条的时候自动关机怎么办 手机的位置信息开不了怎么办呢 滴滴车主接到乘客返回路程要怎么办 移动换话费积分是发什么短信怎么办 手机店积分换手机被贷款怎么办 心悦俱乐部礼包已过期是怎么办 心悦兑换的东西不是账号绑定怎么办 心悦会员绑定的手机号不用了怎么办 想在京东商城开个网店怎么办呢