国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

音視頻開(kāi)發(fā)---ffmpeg rtmp推流

這篇具有很好參考價(jià)值的文章主要介紹了音視頻開(kāi)發(fā)---ffmpeg rtmp推流。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、推流介紹


推流是將輸入視頻數(shù)據(jù)推送至流媒體服務(wù)器, 輸入視頻數(shù)據(jù)可以是本地視頻文件(avi,mp4,flv......),也可以是內(nèi)存視頻數(shù)據(jù),或者攝像頭等系統(tǒng)設(shè)備,也可以是網(wǎng)絡(luò)流URL。本篇介紹將本地視頻文件通過(guò)FFmpeg編程以RTMP直播流的形式推送至RTMP流媒體服務(wù)器的方法。

推流的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如下:

ffmpeg rtmp推流,音視頻開(kāi)發(fā),音視頻,服務(wù)器,Powered by 金山文檔

RTMP流媒體服務(wù)器: 采用nginx+rtmp module實(shí)現(xiàn)

RTMP拉流器:

RTMP推流器:采用ffmpeg實(shí)現(xiàn)

需要注意的是,RTMP采用的封裝格式是FLV。在指定輸出流媒體格式的時(shí)候需要指定其封裝格式為“flv”。同理,其他流媒體協(xié)議也需要指定其封裝格式。例如采用UDP推送流媒體的時(shí)候,可以指定其封裝格式為“mpegts”。

2、FFmpeg推流


FFMpeg處理RTMP流有兩種方式:

  • 一個(gè)是使用自帶的RTMP代碼功能;

  • 一個(gè)是使用第三方庫(kù)librtmp;

這兩種方式是有些區(qū)別的

1. FFmpeg自帶的RTMP代碼功能

FFmpeg自帶的RTMP代碼只支持RTMP協(xié)議,不支持rtmpt,rtmpe,rtmpte和rtmps協(xié)議;

命令行設(shè)置如下:

\1. 將RTMP流原樣保存成文件

# ./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec copy -vcodec copy -f flv -y test.flv

\2. 將RTMP流轉(zhuǎn)碼保存成文件

# ./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec ... -vcodec ... -f mp4 -y test.mp4

\3. 將RTMP流轉(zhuǎn)碼后再以RTMP流的方式推送到RTMP流服務(wù)器

# ./ffmpeg -i rtmp://192.168.1.11:1935/live/teststream -acodec ... -vcodec ... -f flv rtmp://10.2.11.111/live/newstream

2. 第三方庫(kù)librtmp

如何讓FFMpeg鏈接該庫(kù)(后續(xù)更新)

FFMpeg可以支持rtmp://, rtmpt://, rtmpe://, rtmpte://,以及 rtmps://協(xié)議。

鏈接了librtmp的FFMpeg接受一個(gè)字符串的輸入方式,

如:"rtmp://server:port/app/playpath/stream_name live=1 playpath=xxx ..."

NOTE:引號(hào)是必須的;

\1. 保存RTMP直播流原樣保存成文件:

# ./ffmpeg -i "rtmp://http://pub1.guoshi.com/live/newcetv1 live=1" -vcodec copy -acodec copy -y cetv1.flv

\2. 將RTMP流轉(zhuǎn)碼后再以RTMP流的方式推送到RTMP流服務(wù)器

# ./ffmpeg -i "rtmp://192.168.1.11:1935/live/app/teststream live=1" -acodec ... -vcodec ... -f flv rtmp://10.2.11.111/live/newstream

\3. 用ffplay播放RTMP直播流:

ffplay "rtmp://http://pub1.guoshi.com/live/newcetv1 live=1"

\4. 在使用FFMPEG類庫(kù)進(jìn)行編程的時(shí)候,也是一樣的,

只需要將字符串傳遞給avformat_open_input()就行了,形如:

ffplay "rtmp://http://pub1.guoshi.com/live/newcetv1 live=1"

char url[]="rtmp://http://live.hkstv.hk.lxdns.com/live/hks live=1";

avformat_open_input(&pFormatCtx,url,NULL,&avdic)

3、推流器函數(shù)流程圖


ffmpeg rtmp推流,音視頻開(kāi)發(fā),音視頻,服務(wù)器,Powered by 金山文檔

4、代碼


int main(int argc, char * argv[])

{

AVFormatContext *pInFmtContext = NULL;

AVStream *in_stream;

AVCodecContext *pInCodecCtx;

AVCodec *pInCodec;

AVPacket *in_packet;

AVFormatContext * pOutFmtContext;

AVOutputFormat *outputFmt;

AVStream * out_stream;

//AVCodecContext * pOutCodecCtx;

//AVCodec *pOutCodec;

//AVPacket *out_packet;

//AVFrame *pOutFrame;

AVRational frame_rate;

double duration;

//int picture_size = 0;

//FILE *fp;

int ret;

const char * default_url = "rtmp://localhost:1935/live/tuiliu1";

char in_file[128] = {0};

char out_file[256] = {0};

int videoindex = -1;

int audioindex = -1;

int video_frame_count = 0;

int audio_frame_count = 0;

int video_frame_size = 0;

int audio_frame_size = 0;

int i;

int got_picture;

if(argc < 2){

printf("Usage: a.out <in_filename> <url>\n");

return -1;

}

memcpy(in_file, argv[1], strlen(argv[1]));

if( argc == 2){

memcpy(out_file, default_url, strlen(default_url));

}else{

memcpy(out_file, argv[2], strlen(argv[2]));

}

//av_register_all();

//avformat_network_init();

// Open an input stream and read the header,

if (avformat_open_input ( &pInFmtContext, in_file, NULL, NULL) < 0){

printf("avformat_open_input failed\n");

return -1;

}

//查詢輸入流中的所有流信息

if( avformat_find_stream_info(pInFmtContext, NULL) < 0){

printf("avformat_find_stream_info failed\n");

return -1;

}

//print

av_dump_format(pInFmtContext, 0, in_file, 0);

ret = avformat_alloc_output_context2(&pOutFmtContext, NULL, "flv", out_file);

if(ret < 0){

printf("avformat_alloc_output_context2 failed\n");

return -1;

}

//outputFmt = pOutFmtContext->oformat;

for(i=0; i < pInFmtContext->nb_streams; i++){

in_stream = pInFmtContext->streams[i];

if( in_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){

audioindex = i;

}

if( in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){

videoindex = i;

frame_rate = av_guess_frame_rate(pInFmtContext, in_stream, NULL);

printf("video: frame_rate:%d/%d\n", frame_rate.num, frame_rate.den);

printf("video: frame_rate:%d/%d\n", frame_rate.den, frame_rate.num);

duration = av_q2d((AVRational){frame_rate.den, frame_rate.num});

}

pInCodec = avcodec_find_decoder(in_stream->codecpar->codec_id);

printf("%x, %d\n", pInCodec, in_stream->codecpar->codec_id);

//printf("-----%s,%s\n", pInCodec->name, in_stream->codec->codec->name);

out_stream = avformat_new_stream(pOutFmtContext, pInCodec);//in_stream->codec->codec);

if( out_stream == NULL){

printf("avformat_new_stream failed:%d\n",i);

}

ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);

if( ret < 0){

printf("avcodec_parameters_copy failed:%d\n", i);

}

out_stream->codecpar->codec_tag = 0;

if( pOutFmtContext->oformat->flags & AVFMT_GLOBALHEADER){//AVFMT_GLOBALHEADER代表封裝格式包含“全局頭”(即整個(gè)文件的文件頭),大部分封裝格式是這樣的。一些封裝格式?jīng)]有“全局頭”,比如MPEG2TS

out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;

}

}

av_dump_format(pOutFmtContext, 0, out_file, 1);

ret = avio_open(&pOutFmtContext->pb, out_file, AVIO_FLAG_WRITE);

if(ret < 0){

printf("avio_open failed:%d\n", ret);

return -1;

}

int64_t start_time = av_gettime();

ret = avformat_write_header(pOutFmtContext, NULL);

in_packet = av_packet_alloc();

while(1){

ret = av_read_frame(pInFmtContext, in_packet);

if(ret < 0){

printf("read frame end\n");

break;

}

in_stream = pInFmtContext->streams[in_packet->stream_index];

if(in_packet->stream_index == videoindex){

video_frame_size += in_packet->size;

printf("recv %5d video frame %5d-%5d\n", ++video_frame_count, in_packet->size, video_frame_size);

}

if(in_packet->stream_index == audioindex){

audio_frame_size += in_packet->size;

printf("recv %5d audio frame %5d-%5d\n", ++audio_frame_count, in_packet->size, audio_frame_size);

}

int codec_type = in_stream->codecpar->codec_type;

if( codec_type == AVMEDIA_TYPE_VIDEO){

#if 0

//延時(shí)方案1: 根據(jù) 1/幀率 來(lái)計(jì)算延時(shí)時(shí)間

av_usleep((int64_t)(duration * AV_TIME_BASE));

//av_usleep(10);

printf("%d\n", (int)(duration * AV_TIME_BASE));

#else

// 延時(shí)方案2: 根據(jù)pts時(shí)間與系統(tǒng)時(shí)間的關(guān)系來(lái)計(jì)算延時(shí)時(shí)間, 該方案更優(yōu)

AVRational dst_time_base = {1, AV_TIME_BASE};

int64_t pts_time = av_rescale_q(in_packet->pts, in_stream->time_base, dst_time_base);

int64_t now_time = av_gettime() - start_time;

if( pts_time > now_time)

av_usleep(pts_time - now_time);

//printf("%d\n", pts_time - now_time);

#endif

}

out_stream = pOutFmtContext->streams[in_packet->stream_index];

av_packet_rescale_ts(in_packet,in_stream->time_base, out_stream->time_base);

in_packet->pos = -1;

ret = av_interleaved_write_frame(pOutFmtContext, in_packet);

if( ret < 0){

printf("av_interleaved_write_frame failed\n");

break;

}

av_packet_unref(in_packet);

}

//

av_write_trailer(pOutFmtContext);

av_packet_free(&in_packet);

avformat_close_input(&pInFmtContext);

avio_close( pOutFmtContext->pb);

avformat_free_context(pOutFmtContext);

return 0;

}

有兩點(diǎn)需要注意的地方

\1. 推流的速度

不能一下子將數(shù)據(jù)全推到服務(wù)器,這樣流媒體服務(wù)器承受不住,實(shí)際中音頻流的數(shù)據(jù)量相比視頻要小很多,可以不必管它, 只按視頻播放速度(幀率)來(lái)推流即可滿足需要。因此每推送一個(gè)視頻幀,要延時(shí)一個(gè)視頻幀的時(shí)長(zhǎng)。視頻幀的時(shí)長(zhǎng)可根據(jù)幀率計(jì)算得出,即 1/幀率。

上述代碼中采用的是av_usleep()直接延時(shí)等待的方式, , 等待時(shí)間為‘1/幀率’, 由于存在程序處理的時(shí)間,系統(tǒng)延時(shí)等, 這種方式控制時(shí)間是不準(zhǔn)確的,但是上述代碼卻很直觀的表現(xiàn)了推流延時(shí)的實(shí)現(xiàn)。 實(shí)際中,我們需要考慮系統(tǒng)執(zhí)行的時(shí)間以及延時(shí), 可以結(jié)合系統(tǒng)當(dāng)前時(shí)間與視頻幀pts時(shí)間之間的差距,來(lái)決定延時(shí)的時(shí)間,這樣計(jì)算的延時(shí)時(shí)間相對(duì)更準(zhǔn)確, 計(jì)算公式如下:

delay_time = pts_time - now_time

= av_rescale_q(pkt.dts, ifmt_ctx->streams[videoindex]->time_base, (AVRational){1,AV_TIME_BASE}) - (av_gettime() - start_time)

\2. 推流的類型

上述代碼采用的推流協(xié)議是rtmp, rtmp推流必須推送flv封裝格式,而其他的協(xié)議也有相應(yīng)的格式要求(udp推流必須推送mpegts封裝格式)。 如果要將上述代碼修改為適配多種推流協(xié)議,則可根據(jù)推流協(xié)議自動(dòng)選擇相應(yīng)的封裝格式。

編譯

gcc tuiliu1.c -lavformat -lavcodec -lavutil

驗(yàn)證

要驗(yàn)證推流程序是否正確,我們需要搭建一個(gè)nginx+rtmp流媒體服務(wù)器(搭建nginx+rtmp服務(wù)器),而拉流端可以使用ffplay,參考以下過(guò)程:

1. 啟動(dòng)nginx服務(wù)器

nginx

2. 啟動(dòng)拉流

ffplay rtmp://localhost:1935/live/tuiliu1

3. 啟動(dòng)推流:

./a.out test.flv

?

接下來(lái),就能看視頻了

遺留問(wèn)題

\1. 無(wú)論使用ffplay命令播放視頻還是使用SDL編程播放視頻,都會(huì)導(dǎo)致compiz占用cpu過(guò)高

ffmpeg rtmp推流,音視頻開(kāi)發(fā),音視頻,服務(wù)器,Powered by 金山文檔

也嘗試過(guò)網(wǎng)上的多種解決方式,均無(wú)法解決,懷疑是compiz的bug

\2. 無(wú)論使用ffmpeg命令推流還是使用以上代碼推流,都會(huì)在推流結(jié)束調(diào)用av_write_trailer時(shí)打印

[flv @ 0x858c440] Failed to update header with correct duration.

[flv @ 0x858c440] Failed to update header with correct filesize.

使用以下推流命令依然會(huì)打印以上信息。

ffmpeg -re -i test.mp4 -c copy -f flv rtmp://localhost:1935/live/tuiliu1

原文https://zhuanlan.zhihu.com/p/436334751

★文末名片可以免費(fèi)領(lǐng)取音視頻開(kāi)發(fā)學(xué)習(xí)資料,內(nèi)容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音視頻學(xué)習(xí)路線圖等等。

見(jiàn)下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-597306.html

到了這里,關(guān)于音視頻開(kāi)發(fā)---ffmpeg rtmp推流的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流

    視頻畫(huà)面的采集主要是使用各個(gè)平臺(tái)提供的攝像頭 API 來(lái)實(shí)現(xiàn)的,在為攝像頭設(shè)置了合適的參數(shù)之后,將攝像頭實(shí)時(shí)采集的視頻幀渲染到屏幕上提供給用戶預(yù)覽,然后將該視頻幀傳遞給編碼通道,進(jìn)行編碼。 1. 權(quán)限配置 2. 打開(kāi)攝像頭 2.1 檢查攝像頭 public static void checkCameraSe

    2024年04月12日
    瀏覽(27)
  • Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流(2)

    Android-音視頻學(xué)習(xí)系列-(九)Android-端實(shí)現(xiàn)-rtmp-推流(2)

    配置好之后,檢查一下 AudioRecord 當(dāng)前的狀態(tài)是否可以進(jìn)行錄制,可以通過(guò) AudioRecord##getState 來(lái)獲取當(dāng)前的狀態(tài): STATE_UNINITIALIZED 還沒(méi)有初始化,或者初始化失敗了 STATE_INITIALIZED 已經(jīng)初始化成功了。 2. 開(kāi)啟采集 創(chuàng)建好 AudioRecord 之后,就可以開(kāi)啟音頻數(shù)據(jù)的采集了,可以通過(guò)調(diào)

    2024年04月12日
    瀏覽(21)
  • JavaCV音視頻開(kāi)發(fā)寶典:使用javacv讀取GB28181、??荡笕A平臺(tái)和網(wǎng)絡(luò)攝像頭sdk回調(diào)視頻碼流并轉(zhuǎn)碼推流rtmp流媒體服務(wù)

    JavaCV音視頻開(kāi)發(fā)寶典:使用javacv讀取GB28181、海康大華平臺(tái)和網(wǎng)絡(luò)攝像頭sdk回調(diào)視頻碼流并轉(zhuǎn)碼推流rtmp流媒體服務(wù)

    《JavaCV音視頻開(kāi)發(fā)寶典》專欄目錄導(dǎo)航 《JavaCV音視頻開(kāi)發(fā)寶典》專欄介紹和目錄 本篇文章用于解決javacv接入h264/hevc裸流或者接入ps/ts流等字節(jié)流的非流媒體協(xié)議視頻源接入并推流到rtmp流媒體服務(wù)。 本篇文章適用于gb28181/??荡笕A網(wǎng)絡(luò)攝像機(jī)設(shè)備sdk對(duì)接以及??荡笕A等視頻平

    2023年04月09日
    瀏覽(36)
  • 【音視頻】基于ffmpeg對(duì)視頻的切割/合成/推流

    【音視頻】基于ffmpeg對(duì)視頻的切割/合成/推流

    基于FFmpeg對(duì)視頻進(jìn)行切割、合成和推流的價(jià)值和意義在于它提供了一種高效、靈活且免費(fèi)的方式來(lái)實(shí)現(xiàn)視頻內(nèi)容的定制、管理和分發(fā)。通過(guò)FFmpeg,用戶可以輕松地剪輯視頻片段,根據(jù)需要去除不必要的部分或提取特定時(shí)間段的內(nèi)容,從而優(yōu)化觀看體驗(yàn)和提高內(nèi)容的價(jià)值。視頻

    2024年01月18日
    瀏覽(40)
  • 音視頻 ffmpeg命令直播拉流推流

    對(duì)于不是rtmp的協(xié)議 -c copy要謹(jǐn)慎使用 參數(shù):-re,表示按時(shí)間戳讀取文件 參考:Nginx搭建rtmp流媒體服務(wù)器(Ubuntu 16.04)https://www.jianshu.com/p/16741e363a77 推薦一個(gè)零聲學(xué)院項(xiàng)目課,個(gè)人覺(jué)得老師講得不錯(cuò),分享給大家: 零聲白金學(xué)習(xí)卡(含基礎(chǔ)架構(gòu)/高性能存儲(chǔ)/golang云原生/音視頻/

    2024年02月10日
    瀏覽(30)
  • 使用FFmpeg將本地文件通過(guò)UDP推流的音視頻

    推流是指將音視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸?shù)街付ǖ哪繕?biāo)端,而FFmpeg是一個(gè)功能強(qiáng)大的跨平臺(tái)多媒體處理工具,可以用于音視頻編解碼、轉(zhuǎn)碼、處理等操作。本文將介紹如何使用FFmpeg將本地文件通過(guò)UDP協(xié)議進(jìn)行推流,實(shí)現(xiàn)音視頻數(shù)據(jù)的傳輸。 首先,需要確保已經(jīng)安裝了FFmpeg工具。如

    2024年03月19日
    瀏覽(41)
  • windows10|音視頻剪輯|FFMPEG錄屏和網(wǎng)絡(luò)推流源初步的生成

    windows10|音視頻剪輯|FFMPEG錄屏和網(wǎng)絡(luò)推流源初步的生成

    FFMPEG的功能強(qiáng)大是毋庸置疑的,那么錄屏的需求大家在某些時(shí)候大家可能是非常需要的,例如,現(xiàn)有的項(xiàng)目需要演示,因此錄制一段演示視頻;亦或者做內(nèi)容分發(fā)直播的,比如游戲主播,需要錄制在玩某個(gè)游戲的精彩片段,以創(chuàng)建一個(gè)后期的視頻素材庫(kù); 亦或者通過(guò)FFMPEG抓取

    2024年02月20日
    瀏覽(37)
  • Android-音視頻學(xué)習(xí)系列-(八)基于-Nginx-搭建(rtmp、http)直播服務(wù)器

    Android-音視頻學(xué)習(xí)系列-(八)基于-Nginx-搭建(rtmp、http)直播服務(wù)器

    #!/bin/sh HTTP_FLV_MODULE_PATH=…/nginx-http-flv-module-1.2.7 OpenSSL_PATH=…/openssl-1.1.1d #–prefix=./bin 代表編譯完成之后輸出的路徑地址 #–add-module 將拓展模塊添加到當(dāng)前一起編譯 ./configure --prefix=./bin –add-module= H T T P F L V M O D U L E P A T H ? ? ? w i t h ? o p e n s s l = HTTP_FLV_MODULE_PATH --with

    2024年04月15日
    瀏覽(32)
  • 音視頻開(kāi)發(fā) RTMP協(xié)議發(fā)送H.264編碼及AAC編碼的音視頻(C++實(shí)現(xiàn))

    音視頻開(kāi)發(fā) RTMP協(xié)議發(fā)送H.264編碼及AAC編碼的音視頻(C++實(shí)現(xiàn))

    RTMP(Real Time Messaging Protocol)是專門用來(lái)傳輸音視頻數(shù)據(jù)的流媒體協(xié)議,最初由Macromedia 公司創(chuàng)建,后來(lái)歸Adobe公司所有,是一種私有協(xié)議,主要用來(lái)聯(lián)系Flash Player和RtmpServer,如 FMS , Red5 , crtmpserver 等。RTMP協(xié)議可用于實(shí)現(xiàn)直播、點(diǎn)播應(yīng)用,通過(guò) FMLE(Flash Media Live Encoder) 推送音

    2023年04月08日
    瀏覽(28)
  • Qt音視頻開(kāi)發(fā)42-網(wǎng)絡(luò)推流(視頻推流/本地?cái)z像頭推流/桌面推流/網(wǎng)絡(luò)攝像頭轉(zhuǎn)發(fā)推流等)

    Qt音視頻開(kāi)發(fā)42-網(wǎng)絡(luò)推流(視頻推流/本地?cái)z像頭推流/桌面推流/網(wǎng)絡(luò)攝像頭轉(zhuǎn)發(fā)推流等)

    上次實(shí)現(xiàn)的文件推流,盡管優(yōu)點(diǎn)很多,但是只能對(duì)現(xiàn)在存在的生成好的音視頻文件推流,而現(xiàn)在更多的場(chǎng)景是需要將實(shí)時(shí)的視頻流重新推流分發(fā),用戶在很多設(shè)備比如手機(jī)/平板/網(wǎng)頁(yè)/電腦/服務(wù)器上觀看,這樣就可以很方便的將分散的視頻流統(tǒng)一集中的流媒體服務(wù)器上,然后統(tǒng)

    2024年02月03日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包