ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件。

实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均OK

自己根据博客的代码,vs2010搭建的测试环境。资源下载

具体代码:

  1. #define _AFXDLL

  2. #include<afxwin.h>

  3. #ifdef __cplusplus

  4. extern "C" {

  5. #endif

  6. #include <libavcodec/avcodec.h>

  7. #include <libavformat/avformat.h>

  8. #include <libswscale/swscale.h>

  9. void main()

  10. {

  11. CFile file[5];

  12. BYTE *szTxt[5];

  13. int nWidth = 0;

  14. int nHeight= 0;

  15. int nDataLen=0;

  16. int nLen;

  17. CString csFileName;

  18. for (int fileI = 1; fileI <= 5; fileI ++)

  19. {

  20. csFileName.Format("%d.bmp", fileI);

  21. file[fileI - 1].Open(csFileName,CFile::modeRead | CFile::typeBinary);

  22. nLen = file[fileI - 1].GetLength();

  23. szTxt[fileI -1] = new BYTE[nLen];

  24. file[fileI - 1].Read(szTxt[fileI - 1], nLen);

  25. file[fileI - 1].Close();

  26. //BMP bmi;//BITMAPINFO bmi;

  27. //int nHeadLen = sizeof(BMP);

  28. BITMAPFILEHEADER bmpFHeader;

  29. BITMAPINFOHEADER bmpIHeader;

  30. memcpy(&bmpFHeader,szTxt[fileI -1],sizeof(BITMAPFILEHEADER));

  31. int nHeadLen = bmpFHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

  32. memcpy(&bmpIHeader,szTxt[fileI - 1]+sizeof(BITMAPFILEHEADER),nHeadLen);

  33. nWidth = bmpIHeader.biWidth;// 464;// bmi.bmpInfo.bmiHeader.biWidth;// ;

  34. nHeight = bmpIHeader.biHeight;//362;// bmi.bmpInfo.bmiHeader.biHeight;// ;

  35. szTxt[fileI - 1] += bmpFHeader.bfOffBits;

  36. nDataLen = nLen-bmpFHeader.bfOffBits;

  37. }

  38. getchar();

  39. av_register_all();

  40. avcodec_register_all();

  41. AVFrame *m_pRGBFrame = new AVFrame[1]; //RGB帧数据

  42. AVFrame *m_pYUVFrame = new AVFrame[1];; //YUV帧数据

  43. AVCodecContext *c= NULL;

  44. AVCodecContext *in_c= NULL;

  45. AVCodec *pCodecH264; //编码器

  46. uint8_t * yuv_buff;//

  47. //查找h264编码器

  48. pCodecH264 = avcodec_find_encoder(CODEC_ID_H264);

  49. if(!pCodecH264)

  50. {

  51. fprintf(stderr, "h264 codec not found\n");

  52. getchar();

  53. exit(1);

  54. }

  55. c= avcodec_alloc_context3(pCodecH264);

  56. c->bit_rate = 3000000;// put sample parameters

  57. c->width =nWidth;//

  58. c->height = nHeight;//

  59. // frames per second

  60. AVRational rate;

  61. rate.num = 1;

  62. rate.den = 25;

  63. c->time_base= rate;//(AVRational){1,25};

  64. c->gop_size = 10; // emit one intra frame every ten frames

  65. c->max_b_frames=1;

  66. c->thread_count = 1;

  67. c->pix_fmt = PIX_FMT_YUV420P;//PIX_FMT_RGB24;

  68. //av_opt_set(c->priv_data, /*"preset"*/"libvpx-1080p.ffpreset", /*"slow"*/NULL, 0);

  69. //打开编码器

  70. if(avcodec_open2(c,pCodecH264,NULL)<0){

  71. printf("avcodec_open2 failed\n");

  72. TRACE("不能打开编码库");

  73. getchar();

  74. }

  75. int size = c->width * c->height;

  76. yuv_buff = (uint8_t *) malloc((size * 3) / 2); // size for YUV 420

  77. //将rgb图像数据填充rgb帧

  78. uint8_t * rgb_buff = new uint8_t[nDataLen];

  79. //图象编码 outbuf_size太小会报错,图像清晰度也会差

  80. int outbuf_size = 900000;

  81. uint8_t * outbuf= (uint8_t*)malloc(outbuf_size);

  82. int u_size = 0;

  83. FILE *f=NULL;

  84. char * filename = "myData.h264";

  85. f = fopen(filename, "wb");

  86. if (!f)

  87. {

  88. TRACE( "could not open %s\n", filename);

  89. getchar();

  90. exit(1);

  91. }

  92. //初始化SwsContext

  93. SwsContext * scxt = sws_getContext(c->width,c->height,PIX_FMT_BGR24,c->width,c->height,PIX_FMT_YUV420P,SWS_POINT,NULL,NULL,NULL);

  94. AVPacket avpkt;

  95. //AVFrame *pTFrame=new AVFrame

  96. for (int i=0;i<250;++i)

  97. {

  98. //AVFrame *m_pYUVFrame = new AVFrame[1];

  99. int index = (i / 25) % 5;

  100. memcpy(rgb_buff,szTxt[index],nDataLen);

  101. avpicture_fill((AVPicture*)m_pRGBFrame, (uint8_t*)rgb_buff, PIX_FMT_RGB24, nWidth, nHeight);

  102. //将YUV buffer 填充YUV Frame

  103. avpicture_fill((AVPicture*)m_pYUVFrame, (uint8_t*)yuv_buff, PIX_FMT_YUV420P, nWidth, nHeight);

  104. // 翻转RGB图像

  105. m_pRGBFrame->data[0] += m_pRGBFrame->linesize[0] * (nHeight - 1);

  106. m_pRGBFrame->linesize[0] *= -1;

  107. m_pRGBFrame->data[1] += m_pRGBFrame->linesize[1] * (nHeight / 2 - 1);

  108. m_pRGBFrame->linesize[1] *= -1;

  109. m_pRGBFrame->data[2] += m_pRGBFrame->linesize[2] * (nHeight / 2 - 1);

  110. m_pRGBFrame->linesize[2] *= -1;

  111. //将RGB转化为YUV

  112. sws_scale(scxt,m_pRGBFrame->data,m_pRGBFrame->linesize,0,c->height,m_pYUVFrame->data,m_pYUVFrame->linesize);

  113. static int got_packet_ptr = 0;

  114. av_init_packet(&avpkt);

  115. avpkt.data = outbuf;

  116. avpkt.size = outbuf_size;

  117. u_size = avcodec_encode_video2(c, &avpkt, m_pYUVFrame, &got_packet_ptr);

  118. m_pYUVFrame->pts++;

  119. if (u_size == 0)

  120. {

  121. fwrite(avpkt.data, 1, avpkt.size, f);

  122. }

  123. }

  124. fclose(f);

  125. delete []m_pRGBFrame;

  126. delete []m_pYUVFrame;

  127. delete []rgb_buff;

  128. free(outbuf);

  129. avcodec_close(c);

  130. av_free(c);

  131. }

  132. #ifdef __cplusplus

  133. }

  134. #endif

完全按照博客中的代码测试发现会报下面的信息,而且在播放过程中,画面都是模糊的。修改了outbuff_size的大小解决了这个问题。

疑问:为什么要循环250次?有知道麻烦解答下!

for (int i=0;i<250;++i)

将H264视频保存为BMP图片,具体代码如下:

  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. #include <windows.h>

  5. #ifdef __cplusplus

  6. extern "C" {

  7. #endif

  8. #include <libavcodec/avcodec.h>

  9. #include <libavformat/avformat.h>

  10. #include <libswscale/swscale.h>

  11. void SaveAsBMP (AVFrame *pFrameRGB, int width, int height, int index, int bpp)

  12. {

  13. char buf[5] = {0};

  14. BITMAPFILEHEADER bmpheader;

  15. BITMAPINFOHEADER bmpinfo;

  16. FILE *fp;

  17. char filename[20] = "";

  18. _itoa (index, buf, 10);

  19. strcat (filename, buf);

  20. strcat (filename, ".bmp");

  21. if ( (fp = fopen(filename,"wb+")) == NULL )

  22. {

  23. printf ("open file failed!\n");

  24. return;

  25. }

  26. bmpheader.bfType = 0x4d42;

  27. bmpheader.bfReserved1 = 0;

  28. bmpheader.bfReserved2 = 0;

  29. bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

  30. bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8;

  31. bmpinfo.biSize = sizeof(BITMAPINFOHEADER);

  32. bmpinfo.biWidth = width;

  33. bmpinfo.biHeight = height;

  34. bmpinfo.biPlanes = 1;

  35. bmpinfo.biBitCount = bpp;

  36. bmpinfo.biCompression = BI_RGB;

  37. bmpinfo.biSizeImage = (width*bpp+31)/32*4*height;

  38. bmpinfo.biXPelsPerMeter = 100;

  39. bmpinfo.biYPelsPerMeter = 100;

  40. bmpinfo.biClrUsed = 0;

  41. bmpinfo.biClrImportant = 0;

  42. fwrite (&bmpheader, sizeof(bmpheader), 1, fp);

  43. fwrite (&bmpinfo, sizeof(bmpinfo), 1, fp);

  44. fwrite (pFrameRGB->data[0], width*height*bpp/8, 1, fp);

  45. fclose(fp);

  46. }

  47. int main (void)

  48. {

  49. unsigned int i = 0, videoStream = -1;

  50. AVCodecContext *pCodecCtx;

  51. AVFormatContext *pFormatCtx = NULL;

  52. AVCodec *pCodec;

  53. AVFrame *pFrame, *pFrameRGB;

  54. struct SwsContext *pSwsCtx;

  55. const char *filename = "myData.h264";

  56. AVPacket packet;

  57. int frameFinished;

  58. int PictureSize;

  59. uint8_t *buf;

  60. av_register_all();

  61. if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0 ){

  62. printf ("av open input file failed!\n");

  63. exit (1);

  64. }

  65. if ( avformat_find_stream_info(pFormatCtx,NULL) < 0 ){

  66. printf ("av find stream info failed!\n");

  67. exit (1);

  68. }

  69. for ( i=0; i<pFormatCtx->nb_streams; i++ ){

  70. if ( pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ){

  71. videoStream = i;

  72. break;

  73. }

  74. }

  75. if (videoStream == -1){

  76. printf ("find video stream failed!\n");

  77. exit (1);

  78. }

  79. pCodecCtx = pFormatCtx->streams[videoStream]->codec;

  80. pCodec = avcodec_find_decoder (pCodecCtx->codec_id);

  81. if (pCodec == NULL){

  82. printf ("avcode find decoder failed!\n");

  83. exit (1);

  84. }

  85. if ( avcodec_open2(pCodecCtx, pCodec,NULL)<0 ){

  86. printf ("avcode open failed!\n");

  87. exit (1);

  88. }

  89. pFrame = avcodec_alloc_frame();

  90. pFrameRGB = avcodec_alloc_frame();

  91. if ( (pFrame == NULL)||(pFrameRGB == NULL) ){

  92. printf("avcodec alloc frame failed!\n");

  93. exit (1);

  94. }

  95. PictureSize = avpicture_get_size (PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);

  96. buf = (uint8_t *)av_malloc(PictureSize);

  97. if ( buf == NULL ){

  98. printf( "av malloc failed!\n");

  99. exit(1);

  100. }

  101. avpicture_fill ( (AVPicture *)pFrameRGB, buf, PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);

  102. pSwsCtx = sws_getContext (pCodecCtx->width,

  103. pCodecCtx->height,

  104. pCodecCtx->pix_fmt,

  105. pCodecCtx->width,

  106. pCodecCtx->height,

  107. PIX_FMT_BGR24,

  108. SWS_BICUBIC,

  109. NULL, NULL, NULL);

  110. i = 0;

  111. while(av_read_frame(pFormatCtx, &packet) >= 0){

  112. if(packet.stream_index == videoStream){

  113. avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

  114. if(frameFinished){

  115. //反转图像

  116. pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);

  117. pFrame->linesize[0] *= -1;

  118. pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);

  119. pFrame->linesize[1] *= -1;

  120. pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);

  121. pFrame->linesize[2] *= -1;

  122. sws_scale (pSwsCtx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

  123. SaveAsBMP (pFrameRGB, pCodecCtx->width, pCodecCtx->height, i++, 24);

  124. }

  125. }

  126. av_free_packet(&packet);

  127. }

  128. while(1){

  129. packet.data = NULL;

  130. packet.size = 0;

  131. avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

  132. if(frameFinished){

  133. //反转图像

  134. pFrame->data[0] += pFrame->linesize[0] * (pCodecCtx->height - 1);

  135. pFrame->linesize[0] *= -1;

  136. pFrame->data[1] += pFrame->linesize[1] * (pCodecCtx->height / 2 - 1);

  137. pFrame->linesize[1] *= -1;

  138. pFrame->data[2] += pFrame->linesize[2] * (pCodecCtx->height / 2 - 1);

  139. pFrame->linesize[2] *= -1;

  140. sws_scale (pSwsCtx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);

  141. SaveAsBMP (pFrameRGB, pCodecCtx->width, pCodecCtx->height, i++, 24);

  142. }else{

  143. break;

  144. }

  145. av_free_packet(&packet);

  146. }

  147. sws_freeContext (pSwsCtx);

  148. av_free (pFrame);

  149. av_free (pFrameRGB);

  150. avcodec_close (pCodecCtx);

  151. avformat_close_input (&pFormatCtx);

  152. return 0;

  153. }

  154. #ifdef __cplusplus

  155. }

  156. #endif

视频文件保存图片的另外一个方法,看代码

  1. /*File : yuv2pic

  2. *Auth : sjin

  3. *Date : 20141123

  4. *Mail : 413977243@qq.com

  5. */

  6. /*

  7. * 参考博客http://blog.csdn.net/leixiaohua1020/article/details/25346147

  8. *本程序实现了YUV420P像素数据编码为JPEG图片。是最简单的FFmpeg编码方面的教程。

  9. *通过学习本例子可以了解FFmpeg的编码流程。

  10. */

  11. #include <libavcodec/avcodec.h>

  12. #include <libavformat/avformat.h>

  13. #include <libswscale/swscale.h>

  14. #define INPUT_FILE_NAME "yuv420p.yuv"

  15. #define OUTPUT_FILE_NAME "encode.png"

  16. #define INPUT_FILE_WDITH 176

  17. #define INPUT_FILE_HEIGHT 144

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

  19. {

  20. AVFormatContext* pFormatCtx;

  21. AVOutputFormat* fmt;

  22. AVStream* video_st;

  23. AVCodecContext* pCodecCtx;

  24. AVCodec* pCodec;

  25. uint8_t* picture_buf;

  26. AVFrame* picture;

  27. int size;

  28. FILE *in_file = fopen(INPUT_FILE_NAME, "rb"); //视频YUV源文件

  29. int in_w = INPUT_FILE_WDITH;

  30. int in_h = INPUT_FILE_HEIGHT; //宽高

  31. const char* out_file = OUTPUT_FILE_NAME; //输出文件路径

  32. av_register_all();

  33. #if 0

  34. //方法1.组合使用几个函数

  35. pFormatCtx = avformat_alloc_context();

  36. //猜格式。用MJPEG编码

  37. fmt = av_guess_format("mjpeg", NULL, NULL);

  38. pFormatCtx->oformat = fmt;

  39. //注意:输出路径

  40. if (avio_open(&pFormatCtx->pb,out_file, AVIO_FLAG_READ_WRITE) < 0){

  41. printf("输出文件打开失败");

  42. return -1;

  43. }

  44. #else

  45. //方法2.更加自动化一些

  46. //分配一个输出(out_file)文件格式的AVFormatContext的上下文句柄

  47. avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file);

  48. fmt = pFormatCtx->oformat;

  49. video_st = avformat_new_stream(pFormatCtx,NULL);

  50. if (video_st==NULL){

  51. return -1;

  52. }

  53. #endif

  54. pCodecCtx = video_st->codec;

  55. pCodecCtx->codec_id = fmt->video_codec;

  56. pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;

  57. pCodecCtx->pix_fmt = PIX_FMT_YUVJ420P;

  58. pCodecCtx->width = in_w;

  59. pCodecCtx->height = in_h;

  60. pCodecCtx->time_base.num = 1;

  61. pCodecCtx->time_base.den = 25;

  62. //输出格式信息

  63. av_dump_format(pFormatCtx, 0, out_file, 1);

  64. pCodec = avcodec_find_encoder(pCodecCtx->codec_id);

  65. if (!pCodec){

  66. printf("没有找到合适的编码器!");

  67. return -1;

  68. }

  69. if (avcodec_open2(pCodecCtx, pCodec,NULL) < 0){

  70. printf("编码器打开失败!");

  71. return -1;

  72. }

  73. //申请解码后保存视频帧的空间,AVFrame结构体

  74. picture = avcodec_alloc_frame();

  75. //即使我们申请的一帧的内存,当转换的时候,我们仍需要内存去保存原始的数据

  76. //利用下面的函数来获得原始数据帧的大小,手动分配内存

  77. size = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

  78. picture_buf = (uint8_t *)av_malloc(size);

  79. if (!picture_buf){

  80. return -1;

  81. }

  82. //设置指定图像的参数,并指着图像数据缓冲区

  83. avpicture_fill((AVPicture *)picture, picture_buf, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

  84. //写文件头

  85. avformat_write_header(pFormatCtx,NULL);

  86. AVPacket pkt;

  87. int y_size = pCodecCtx->width * pCodecCtx->height;

  88. av_new_packet(&pkt,y_size*3);

  89. //读入YUV

  90. if (fread(picture_buf, 1, y_size*3/2, in_file) < 0){

  91. printf("文件读取错误");

  92. return -1;

  93. }

  94. //翻转图像

  95. picture->data[0] = picture_buf; // 亮度Y

  96. picture->data[1] = picture_buf+ y_size; // U

  97. picture->data[2] = picture_buf+ y_size*5/4; // V

  98. int got_picture=0;

  99. //编码

  100. int ret = avcodec_encode_video2(pCodecCtx, &pkt,picture, &got_picture);

  101. if(ret < 0){

  102. printf("编码错误!\n");

  103. return -1;

  104. }

  105. if (got_picture==1){

  106. pkt.stream_index = video_st->index;

  107. ret = av_write_frame(pFormatCtx, &pkt);

  108. }

  109. av_free_packet(&pkt);

  110. //写文件尾

  111. av_write_trailer(pFormatCtx);

  112. printf("编码成功!\n");

  113. if (video_st){

  114. avcodec_close(video_st->codec);

  115. av_free(picture);

  116. av_free(picture_buf);

  117. }

  118. avio_close(pFormatCtx->pb);

  119. avformat_free_context(pFormatCtx);

  120. fclose(in_file);

  121. return 0;

  122. }

下面是编译的时候,比较好用的Makefile文件

  1. # use pkg-config for getting CFLAGS and LDLIBS

  2. FFMPEG_LIBS= libavdevice \

  3. libavformat \

  4. libavfilter \

  5. libavcodec \

  6. libswresample \

  7. libswscale \

  8. libavutil \

  9. CFLAGS += -Wall -O2 -g

  10. CFLAGS := $(shell pkg-config --cflags $(FFMPEG_LIBS)) $(CFLAGS)

  11. LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) $(LDLIBS)

  12. EXAMPLES= yuv2pic

  13. OBJS=$(addsuffix .o,$(EXAMPLES))

  14. # the following examples make explicit use of the math library

  15. LDLIBS += -lx264 -m32 -pthread -lm -ldl

  16. .phony:all clean

  17. all: $(OBJS) $(EXAMPLES)

  18. clean:

  19. rm $(EXAMPLES) $(OBJS)

参考资料:

1、http://blog.csdn.net/eightdegree/article/details/7425635#reply

2、http://blog.csdn.net/leixiaohua1020/article/details/25346147

使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码相关推荐

  1. 在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv视频数据

    在Ubuntu虚拟机使用ffmpeg采集摄像头的yuv数据 使用命令从视频提取出yuv数据 提取yuv视频数据 单独提取视频的y分量或u.v分量 通过摄像头获取yuv数据 使用命令从视频提取出yuv数 ...

  2. php将视频流逐帧转图片,ffmpeg sdk解码视频帧后保存成BMP或JPG的方法

    ffmpeg解码视频的例子可以看官方自带的encode_decode.c. 官方解码保存成ppm,这里接下来保存成BMP或JPG. 原理: 保存BMP是解码成功后,从YUV420转成RGB24,然后构 ...

  3. Base64图片编码的使用

    一.base64编码介绍 二.base64图片使用介绍 三.base64图片编码大小与原图文件大小之间的联系 四.代码实现 一.base64编码介绍 Base64是网络上最常见的用于传输8Bit字节代 ...

  4. C# Base64图片编码和解码

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Ba ...

  5. FFmpeg 将多张图片编码成视频

    前言 本篇文章的需求是将相机获取到的图片进行编码,编码成一个视频,耗费了大约一个星期的时间在解决各种问题.这里阐述一下这篇文章所要解决的几个问题: 1.如何将多张图片编码成视频. 2.如何进行定时录制 ...

  6. BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的

    BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的 原文:http://blog.csdn.net/qq445803843/article/details/46476433 这段代 ...

  7. 【Android 安装包优化】WebP 图片格式性能测试 ( 测试 WebP 图片解码速度 | 测试 WebP 图片编码速度 )

    文章目录 一.测试 WebP 图片解码速度 二.测试 WebP 图片编码速度 三.参考资料 测试结果 : WebP 格式图片 , 解码快 , 编码慢 , 占用空间小 ; 在解码速度上 , WebP 格 ...

  8. 纯C++代码实现将像素矩阵保存为bmp图片

    用C++代码将像素矩阵保存为图片,这里以读取yuv序列视频帧为例进行分析,假设4:2:0yuv序列有300帧,则首先需要将每一视频帧保存在一个像素矩阵中,然后将每一个矩阵保存为图片,最终会有300个b ...

  9. RGB数据保存为BMP图片

    一.BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成 1.BMP文件头(14字节) [cpp] view plain copytypedef struct /**** BMP file h ...

最新文章

  1. React源码分析与实现(一):组件的初始化与渲染
  2. Sql Server编程
  3. ospf hello时间和dead_使用OSPF协议使SPOKE端正常通信
  4. php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步
  5. [vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
  6. Python中曲率与弯曲的转换_黎曼几何学习笔记(3)——共形数量曲率与高斯曲率...
  7. 百度地图隐藏地名_官宣,鲁能公馆是“怪地名”,以后我只是秦新名邸
  8. Android之AIDL跨进程通讯
  9. iPhone的MobileTerminal使用经验
  10. python数字猜大小游戏
  11. Node.js meitulu图片批量下载爬虫1.06版
  12. 楷书书法规则_毛笔书法楷书的结构规则
  13. 发布本人整理的面试问题大全,为准备找工作的同行们尽一份力!希望大家多补充或回答!
  14. SocialFi 何以成就 Web3 去中心化社交未来
  15. AForge.net 使用之录像拍照功能实现
  16. idea如何连接达梦数据库
  17. 7-1 身体质量指数(BMI)测算 (10 分)
  18. NCR3网络技术速成笔记(1)
  19. JIL Widget开发入门
  20. 机器学习——决策树(decision tree)

热门文章

  1. 麻省理工学院计算机专业2018,麻省理工学院专业排名一览及最强专业推荐(QS世界大学排名)...
  2. java调用kafka
  3. android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
  4. swagger2 分组
  5. java水印图片_JAVA实用案例之图片水印开发
  6. ajax 高并发请求,理解node.js处理高并发请求原理
  7. Github作为maven私服仓库用
  8. 【算法设计与分析】10 差消法化简高阶递推方程
  9. linux 配置EPEL源
  10. No projects are found to import