精华内容
下载资源
问答
  • 很多人会碰到这样的问题,A电脑中做完相关操作后,并且已经成功保存到了U盘里,但是当把这个文件放到B电脑中时,文件却打不开,或是文件显示数据找不到。这是由于存储时,保存路径没设置好的问题。为了解决这个...

    很多人会碰到这样的问题,在A电脑中做完相关操作后,并且已经成功保存到了U盘里,但是当把这个文件放到B电脑中时,文件却打不开,或是文件显示数据找不到。这是由于在存储时,保存路径没设置好的问题。为了解决这个问题,改下保存设置的路径即可。看下图操作:

    1.打开ArcMap,点击File中的Map Document Properties
    在这里插入图片描述

    2.将下图中的红框处勾选。此时的存储已由绝对路径存储转变为相对路径存储
    在这里插入图片描述

    3.按以上步骤则可完成路径的设置,下一次把文件放到另一台电脑上时就不会显示找不到数据了

    展开全文
  • 代码读取摄像头数据 并编码保存 node ffmpeg的强大毋庸置疑,根据网上的一些学习资料,这里给予一些讲解。 命令行打开摄像头 1、配置环境变量 windows ffmpeg从官网下载后,shared\bin 目录下可以找到相应的...

    目录

    命令行打开摄像头

    1、配置环境变量

    2、从命令打开摄像头

    代码读取摄像头数据 并编码保存

    node


    ffmpeg的强大毋庸置疑,根据网上的一些学习资料,这里给予一些讲解。

    命令行打开摄像头

    1、配置环境变量

    windows ffmpeg从官网下载后,shared\bin 目录下可以找到相应的ffmpeg 的一些可执行文件

    ,将这些文件配置 环境变量path中。

    2、从命令打开摄像头

    其实,ffmpeg的这三个执行文件,可以实现很多代码实现的命令。

    1、查询设备

    ffmpeg -list_devices true -f dshow -i dummy

    这个命令可以查询电脑的输出设备。

    configuration是ffmpeg的配置,当然也可以到ffmpeg文件中看

    Lenovo EasyCamera 是电脑摄像头

    Realek High Definition Audio 是声卡 ,前面的乱码我们可以  此电脑-> 右键管理-> 设备管理器中查看如下:

    2、打开摄像头

    ffplay -f dshow -i video="Lenovo EasyCamera"

    这样我们就可以打开摄像头,如下

    感兴趣的可以通过下载ffmpeg源码,看一些命令的执行操作,执行的代码,就可以学习到一些基本的方法

    代码读取摄像头数据 并编码保存

    主要流程 ,代码主要来源于 王刚的跟我学ffmpeg视频

                                       

    1、打开摄像头

    这里是打开输入设备,其中操作解释 看注解,初始化inputContext

    int ret = OpenInput("video=Lenovo EasyCamera");

    int OpenInput(string inputUrl)
    {
    	inputContext = avformat_alloc_context();	
    	lastReadPacktTime = av_gettime();
    	// 设置超时操作
    	inputContext->interrupt_callback.callback = interrupt_cb;
    	// 使用libavdevice的时候 用av_find_input_format() 寻找输入设备,这里是寻找摄像头设备 
    	//具体可参考 https://blog.csdn.net/leixiaohua1020/article/details/39702113
    	 AVInputFormat *ifmt = av_find_input_format("dshow");
    	 // 利用AVDictionary 来配置参数 key =rtbufsize , value = 18432000
    	 AVDictionary *format_opts =  nullptr;
    	 av_dict_set_int(&format_opts, "rtbufsize", 18432000  , 0);
    
    	int ret = avformat_open_input(&inputContext, inputUrl.c_str(), ifmt , &format_opts);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Input file open input failed\n");
    		return  ret;
    	}
    	ret = avformat_find_stream_info(inputContext,nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Find input file stream inform failed\n");
    	}
    	else
    	{
    		av_log(NULL, AV_LOG_FATAL, "Open input file  %s success\n",inputUrl.c_str());
    	}
    	return ret;
    }

    2、初始化读取packet包的解码器

    InitDecodeContext(inputContext->streams[0]);

    // 初始化解码器,根据输入流编码 找到 并打开 解码器
    int InitDecodeContext(AVStream *inputStream)
    {	
    	auto codecId = inputStream->codec->codec_id;
    	auto codec = avcodec_find_decoder(codecId);
    	if (!codec)
    	{
    		return -1;
    	}
    
    	int ret = avcodec_open2(inputStream->codec, codec, NULL);
    	return ret;
    
    }

    3、初始化对解码后的frame数据的编码器

    编码器是根据你要选择的编码方式,这里选择的是AV_CODEC_ID_H264

    ret = initEncoderCodec(inputContext->streams[0],&encodeContext);

    // 初始化编码器 找到 h264编码,初始化,并且打开
    int initEncoderCodec(AVStream* inputStream,AVCodecContext **encodeContext)
    	{
    		AVCodec *  picCodec;
    		
    		picCodec = avcodec_find_encoder(AV_CODEC_ID_H264);		
    		(*encodeContext) = avcodec_alloc_context3(picCodec);
    	
    		(*encodeContext)->codec_id = picCodec->id;
    		(*encodeContext)->has_b_frames = 0;
    		(*encodeContext)->time_base.num = inputStream->codec->time_base.num;
    		(*encodeContext)->time_base.den = inputStream->codec->time_base.den;
    		(*encodeContext)->pix_fmt =  *picCodec->pix_fmts;
    		(*encodeContext)->width = inputStream->codec->width;
    		(*encodeContext)->height =inputStream->codec->height;
    		(*encodeContext)->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    		int ret = avcodec_open2((*encodeContext), picCodec, nullptr);
    		if (ret < 0)
    		{
    			std::cout<<"open video codec failed"<<endl;
    			return  ret;
    		}
    			return 1;
    	}

    4、打开输出设备

    ret = OpenOutput("D:\\Camera.mp4",encodeContext); 

    // 输出操作
    int OpenOutput(string outUrl,AVCodecContext *encodeCodec)
    {
    
    	int ret  = avformat_alloc_output_context2(&outputContext, nullptr, "mp4", outUrl.c_str());
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "open output context failed\n");
    		goto Error;
    	}
    
    	ret = avio_open2(&outputContext->pb, outUrl.c_str(), AVIO_FLAG_WRITE,nullptr, nullptr);	
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "open avio failed");
    		goto Error;
    	}
    
    	for(int i = 0; i < inputContext->nb_streams; i++) // 如果有音频 和 视频 nputContext->nb_streams则为2 
    	{
    		if(inputContext->streams[i]->codec->codec_type == AVMediaType::AVMEDIA_TYPE_AUDIO)// 如果有stream 为音频 则不处理
    		{
    			continue;
    		}
    		AVStream * stream = avformat_new_stream(outputContext, encodeCodec->codec);				
    		ret = avcodec_copy_context(stream->codec, encodeCodec);	
    		if(ret < 0)
    		{
    			av_log(NULL, AV_LOG_ERROR, "copy coddec context failed");
    			goto Error;
    		}
    	}
    
    	ret = avformat_write_header(outputContext, nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "format write header failed");
    		goto Error;
    	}
    
    	av_log(NULL, AV_LOG_FATAL, " Open output file success %s\n",outUrl.c_str());			
    	return ret ;
    Error:
    	if(outputContext)
    	{
    		for(int i = 0; i < outputContext->nb_streams; i++)
    		{
    			avcodec_close(outputContext->streams[i]->codec);
    		}
    		avformat_close_input(&outputContext);
    	}
    	return ret ;
    }
    

    5 初始化解码frmae 要缩放到目的大小的缩放 上下文pSwsContext

        swsScaleContext.SetSrcResolution(inputContext->streams[0]->codec->width, inputContext->streams[0]->codec->height);
        swsScaleContext.SetDstResolution(encodeContext->width,encodeContext->height);
        swsScaleContext.SetFormat(inputContext->streams[0]->codec->pix_fmt, encodeContext->pix_fmt);
        initSwsContext(&pSwsContext, &swsScaleContext);    

    swsScaleContext 是自定义的类,用来存储读取 原始 frame 宽高、和目标宽高、原始frame一个像素大小和 输出 fram一个像素大小(与输入输出的编码格式有关)

    class SwsScaleContext
    {
    public:
    	SwsScaleContext()
    	{
    
    	}
    	void SetSrcResolution(int width, int height)
    	{
    		srcWidth = width;
    		srcHeight = height;
    	}
    
    	void SetDstResolution(int width, int height)
    	{
    		dstWidth = width;
    		dstHeight = height;
    	}
    	void SetFormat(AVPixelFormat iformat, AVPixelFormat oformat)
    	{
    		this->iformat = iformat;
    		this->oformat = oformat;
    	}
    public:
    	int srcWidth;
    	int srcHeight;
    	int dstWidth;
    	int dstHeight;
    	AVPixelFormat iformat;
    	AVPixelFormat oformat;
    };

    initSwsContext 方法是初始化pSwsContext

    sws_getContext 函数就是返回SwsContext * 类型

    
    int initSwsContext(struct SwsContext** pSwsContext, SwsScaleContext *swsScaleContext)
    {
    	*pSwsContext = sws_getContext(swsScaleContext->srcWidth, swsScaleContext->srcHeight, swsScaleContext->iformat,
    		swsScaleContext->dstWidth, swsScaleContext->dstHeight, swsScaleContext->oformat,
    		SWS_BICUBIC,
    		NULL, NULL, NULL);
    	if (pSwsContext == NULL)
    	{
    		return -1;
    	}
    	return 0;
    }
    

    6、初始化 目的pSwsVideoFrame的大小

    initSwsFrame(pSwsVideoFrame,encodeContext->width, encodeContext->height);

    
    int initSwsFrame(AVFrame *pSwsFrame, int iWidth, int iHeight)
    {
    	// 计算一帧的大小
    	int numBytes = av_image_get_buffer_size(encodeContext->pix_fmt, iWidth, iHeight, 1);
    	/*if(pSwpBuffer)
    	{
    		av_free(pSwpBuffer);
    	}*/
    	pSwpBuffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));
    	// 将数据存入 uint8_t 中
    	av_image_fill_arrays(pSwsFrame->data, pSwsFrame->linesize, pSwpBuffer, encodeContext->pix_fmt, iWidth, iHeight, 1);			 
    	pSwsFrame->width = iWidth;
    	pSwsFrame->height = iHeight;
    	pSwsFrame->format = encodeContext->pix_fmt;
    	return 1;
    }
    

     

    7、读取数据到packet

    auto packet = ReadPacketFromSource();

    shared_ptr<AVPacket> ReadPacketFromSource()
    {
    	// 初始化一个 数据packet share_ptr 利用get 来获得包数据 指针
    	shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p);});
    	av_init_packet(packet.get());
    	lastReadPacktTime = av_gettime();
    	int ret = av_read_frame(inputContext, packet.get());
    	if(ret >= 0)
    	{
    		return packet;
    	}
    	else
    	{
    		return nullptr;
    	}
    }

    8、对读取的packet进行解码 到frame这中

    Decode(inputContext->streams[0],packet.get(),videoFrame)

    // 解码 ,将 packet 解码到 frame中
    bool Decode(AVStream* inputStream,AVPacket* packet, AVFrame *frame)
    {
    	int gotFrame = 0;
    	auto hr = avcodec_decode_video2(inputStream->codec, frame, &gotFrame, packet);
    	if (hr >= 0 && gotFrame != 0)
    	{
    		return true;
    	}
    	return false;
    }
    

    9、缩放frame数据到目的编码frame所需的大小,存储到pSwsVideoFrame->data

    sws_scale(pSwsContext, (const uint8_t *const *)videoFrame->data,videoFrame->linesize, 0,
     inputContext->streams[0]->codec->height, (uint8_t *const *)pSwsVideoFrame->data, pSwsVideoFrame->linesize);

    10对缩小frame数据进行编码

    auto packetEncode = Encode(encodeContext,pSwsVideoFrame);

    // 对 解码packet后的数据fram 进行编码,并且 将编码数据存在 创建的packet
    std::shared_ptr<AVPacket> Encode(AVCodecContext *encodeContext,AVFrame * frame)
    {
    	int gotOutput = 0;
    	std::shared_ptr<AVPacket> pkt(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p); });
    	av_init_packet(pkt.get());
    	pkt->data = NULL;
    	pkt->size = 0;
    	int ret = avcodec_encode_video2(encodeContext, pkt.get(), frame, &gotOutput);
    	if (ret >= 0 && gotOutput)
    	{
    		return pkt;
    	}
    	else
    	{
    		return nullptr;
    	}
    }

    11、写入数据

    ret = WritePacket(packetEncode);

    到这里就介绍完了 整个 读取摄像头,到保存为mp4格式视频过程,至于初始化,和编码器解码器的关闭操作就不介绍了,这里没有读取音频数据,所以没有声音。

    node

    1、此文用到的ffmpeg为 3.0的,新版本的stream[0]->codec 已经弃用,AVCodecContext   可用以下方法来创建

    AVCodecContext  *inAVCodecContext = avcodec_alloc_context3(NULL);
    avcodec_parameters_to_context(inAVCodecContext, inputContext->streams[i]->codecpar);
    ret = avcodec_parameters_from_context(stream->codecpar, inAVCodecContext);

    2、avcodec_close 已弃用、不支持多次开关, 使用avcodec_free_context() 来代替释放。想多次开启使用multiple codec contexts

    完整版本的代码:

    #include "stdafx.h"
    #include <string>
    #include <memory>
    #include <thread>
    #include <iostream>
    #include <iostream>
    using namespace std;
    #include "pch.h"
    
    class SwsScaleContext
    {
    public:
    	SwsScaleContext()
    	{
    
    	}
    	void SetSrcResolution(int width, int height)
    	{
    		srcWidth = width;
    		srcHeight = height;
    	}
    
    	void SetDstResolution(int width, int height)
    	{
    		dstWidth = width;
    		dstHeight = height;
    	}
    	void SetFormat(AVPixelFormat iformat, AVPixelFormat oformat)
    	{
    		this->iformat = iformat;
    		this->oformat = oformat;
    	}
    public:
    	int srcWidth;
    	int srcHeight;
    	int dstWidth;
    	int dstHeight;
    	AVPixelFormat iformat;
    	AVPixelFormat oformat;
    };
    
    AVFormatContext *inputContext = nullptr;
    AVCodecContext *encodeContext = nullptr;
    AVFormatContext * outputContext;
    int64_t lastReadPacktTime ;
    int64_t packetCount = 0;
    struct SwsContext* pSwsContext = nullptr;
    uint8_t * pSwpBuffer = nullptr;
    static int interrupt_cb(void *ctx)
    {
    	int  timeout  = 3;
    	if(av_gettime() - lastReadPacktTime > timeout *1000 *1000)
    	{
    		return -1;
    	}
    	return 0;
    }
    
    int OpenInput(string inputUrl)
    {
    	inputContext = avformat_alloc_context();	
    	lastReadPacktTime = av_gettime();
    	// 设置超时操作
    	inputContext->interrupt_callback.callback = interrupt_cb;
    	// 使用libavdevice的时候 用av_find_input_format() 寻找输入设备,这里是寻找摄像头设备 
    	//具体可参考 https://blog.csdn.net/leixiaohua1020/article/details/39702113
    	 AVInputFormat *ifmt = av_find_input_format("dshow");
    	 // 利用AVDictionary 来配置参数 key =rtbufsize , value = 18432000
    	 AVDictionary *format_opts =  nullptr;
    	 av_dict_set_int(&format_opts, "rtbufsize", 18432000  , 0);
    
    	int ret = avformat_open_input(&inputContext, inputUrl.c_str(), ifmt , &format_opts);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Input file open input failed\n");
    		return  ret;
    	}
    	ret = avformat_find_stream_info(inputContext,nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "Find input file stream inform failed\n");
    	}
    	else
    	{
    		av_log(NULL, AV_LOG_FATAL, "Open input file  %s success\n",inputUrl.c_str());
    	}
    	return ret;
    }
    
    
    shared_ptr<AVPacket> ReadPacketFromSource()
    {
    	// 初始化一个 数据packet share_ptr 利用get 来获得包数据 指针
    	shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p);});
    	av_init_packet(packet.get());
    	lastReadPacktTime = av_gettime();
    	int ret = av_read_frame(inputContext, packet.get());
    	if(ret >= 0)
    	{
    		return packet;
    	}
    	else
    	{
    		return nullptr;
    	}
    }
    
    // 输出操作
    int OpenOutput(string outUrl,AVCodecContext *encodeCodec)
    {
    
    	int ret  = avformat_alloc_output_context2(&outputContext, nullptr, "mp4", outUrl.c_str());
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "open output context failed\n");
    		goto Error;
    	}
    
    	ret = avio_open2(&outputContext->pb, outUrl.c_str(), AVIO_FLAG_WRITE,nullptr, nullptr);	
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "open avio failed");
    		goto Error;
    	}
    
    	for(int i = 0; i < inputContext->nb_streams; i++) // 如果有音频 和 视频 nputContext->nb_streams则为2 
    	{
    		if(inputContext->streams[i]->codec->codec_type == AVMediaType::AVMEDIA_TYPE_AUDIO)// 如果有stream 为音频 则不处理
    		{
    			continue;
    		}
    		AVStream * stream = avformat_new_stream(outputContext, encodeCodec->codec);				
    		ret = avcodec_copy_context(stream->codec, encodeCodec);	
    		if(ret < 0)
    		{
    			av_log(NULL, AV_LOG_ERROR, "copy coddec context failed");
    			goto Error;
    		}
    	}
    
    	ret = avformat_write_header(outputContext, nullptr);
    	if(ret < 0)
    	{
    		av_log(NULL, AV_LOG_ERROR, "format write header failed");
    		goto Error;
    	}
    
    	av_log(NULL, AV_LOG_FATAL, " Open output file success %s\n",outUrl.c_str());			
    	return ret ;
    Error:
    	if(outputContext)
    	{
    		for(int i = 0; i < outputContext->nb_streams; i++)
    		{
    			avcodec_close(outputContext->streams[i]->codec);
    		}
    		avformat_close_input(&outputContext);
    	}
    	return ret ;
    }
    
    void Init()
    {
    	av_register_all();
    	avfilter_register_all();
    	avformat_network_init();
    	avdevice_register_all();
    	// 设置 log 为error级别
    	av_log_set_level(AV_LOG_ERROR);
    }
    
    void CloseInput()
    {
    	if(inputContext != nullptr)
    	{
    		avformat_close_input(&inputContext);
    	}
    
    	if(pSwsContext)
    	{
    		sws_freeContext(pSwsContext);
    	}
    }
    
    void CloseOutput()
    {
    	if(outputContext != nullptr)
    	{
    		//(1)循环调用interleave_packet()以及write_packet(),将还未输出的AVPacket输出出来。
    		//(2)调用AVOutputFormat的write_trailer(),输出文件尾。
    		// 具体看雷神博客 : https://blog.csdn.net/leixiaohua1020/article/details/44201645
    		int ret = av_write_trailer(outputContext);		
    		avformat_close_input(&outputContext);
    	}
    }
    
    int WritePacket(shared_ptr<AVPacket> packet)
    {
    	auto inputStream = inputContext->streams[packet->stream_index];
    	auto outputStream = outputContext->streams[packet->stream_index];	
    
    	// time_base 表示包在视频中的流 的时间基数,跟编码格式有关系
    	// den 是 一个base stream 时间(分母)
    	// num 是 分子,表示 一个 base stream时间中 分多少份儿,
    	// 这里除30 ,表示 一个 packet 占用的视频流为 base/num/30 (自己的理解,仅供参考)
    	//这里 需要先设置好 packet的 pts,否则视频播放速度会乱
    	packet->pts = packet->dts = packetCount * (outputContext->streams[0]->time_base.den) / 
    		             outputContext->streams[0]->time_base.num / 30 ;
    	//cout <<"pts:"<<packet->pts<<endl;
    	packetCount++;
    	return av_interleaved_write_frame(outputContext, packet.get());
    }
    
    // 初始化解码器,根据输入流编码 找到 并打开 解码器
    int InitDecodeContext(AVStream *inputStream)
    {	
    	auto codecId = inputStream->codec->codec_id;
    	auto codec = avcodec_find_decoder(codecId);
    	if (!codec)
    	{
    		return -1;
    	}
    
    	int ret = avcodec_open2(inputStream->codec, codec, NULL);
    	return ret;
    
    }
    
    // 初始化编码器 找到 h264编码,初始化,并且打开
    int initEncoderCodec(AVStream* inputStream,AVCodecContext **encodeContext)
    	{
    		AVCodec *  picCodec;
    		
    		picCodec = avcodec_find_encoder(AV_CODEC_ID_H264);		
    		(*encodeContext) = avcodec_alloc_context3(picCodec);
    	
    		(*encodeContext)->codec_id = picCodec->id;
    		(*encodeContext)->has_b_frames = 0;
    		(*encodeContext)->time_base.num = inputStream->codec->time_base.num;
    		(*encodeContext)->time_base.den = inputStream->codec->time_base.den;
    		(*encodeContext)->pix_fmt =  *picCodec->pix_fmts;
    		(*encodeContext)->width = inputStream->codec->width;
    		(*encodeContext)->height =inputStream->codec->height;
    		(*encodeContext)->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    		int ret = avcodec_open2((*encodeContext), picCodec, nullptr);
    		if (ret < 0)
    		{
    			std::cout<<"open video codec failed"<<endl;
    			return  ret;
    		}
    			return 1;
    	}
    
    // 解码 ,将 packet 解码到 frame中
    bool Decode(AVStream* inputStream,AVPacket* packet, AVFrame *frame)
    {
    	int gotFrame = 0;
    	auto hr = avcodec_decode_video2(inputStream->codec, frame, &gotFrame, packet);
    	if (hr >= 0 && gotFrame != 0)
    	{
    		return true;
    	}
    	return false;
    }
    
    // 对 解码packet后的数据fram 进行编码,并且 将编码数据存在 创建的packet
    std::shared_ptr<AVPacket> Encode(AVCodecContext *encodeContext,AVFrame * frame)
    {
    	int gotOutput = 0;
    	std::shared_ptr<AVPacket> pkt(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p); });
    	av_init_packet(pkt.get());
    	pkt->data = NULL;
    	pkt->size = 0;
    	int ret = avcodec_encode_video2(encodeContext, pkt.get(), frame, &gotOutput);
    	if (ret >= 0 && gotOutput)
    	{
    		return pkt;
    	}
    	else
    	{
    		return nullptr;
    	}
    }
    
    
    int initSwsContext(struct SwsContext** pSwsContext, SwsScaleContext *swsScaleContext)
    {
    	*pSwsContext = sws_getContext(swsScaleContext->srcWidth, swsScaleContext->srcHeight, swsScaleContext->iformat,
    		swsScaleContext->dstWidth, swsScaleContext->dstHeight, swsScaleContext->oformat,
    		SWS_BICUBIC,
    		NULL, NULL, NULL);
    	if (pSwsContext == NULL)
    	{
    		return -1;
    	}
    	return 0;
    }
    
    int initSwsFrame(AVFrame *pSwsFrame, int iWidth, int iHeight)
    {
    	// 计算一帧的大小
    	int numBytes = av_image_get_buffer_size(encodeContext->pix_fmt, iWidth, iHeight, 1);
    	/*if(pSwpBuffer)
    	{
    		av_free(pSwpBuffer);
    	}*/
    	pSwpBuffer = (uint8_t *)av_malloc(numBytes * sizeof(uint8_t));
    	// 将数据存入 uint8_t 中
    	av_image_fill_arrays(pSwsFrame->data, pSwsFrame->linesize, pSwpBuffer, encodeContext->pix_fmt, iWidth, iHeight, 1);			 
    	pSwsFrame->width = iWidth;
    	pSwsFrame->height = iHeight;
    	pSwsFrame->format = encodeContext->pix_fmt;
    	return 1;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	
    	SwsScaleContext swsScaleContext;
    	AVFrame *videoFrame = av_frame_alloc();
    	AVFrame *pSwsVideoFrame = av_frame_alloc();
    
    	Init();
    	int ret = OpenInput("video=Lenovo EasyCamera");
    	
    	if(ret <0) goto Error;
    	
    	InitDecodeContext(inputContext->streams[0]);
    	
    
    	ret = initEncoderCodec(inputContext->streams[0],&encodeContext);
    
    	if(ret >= 0)
    	{
    		ret = OpenOutput("D:\\Camera.mp4",encodeContext); 
    	}
    	if(ret <0) goto Error;
    	
    	
    	swsScaleContext.SetSrcResolution(inputContext->streams[0]->codec->width, inputContext->streams[0]->codec->height);
    	swsScaleContext.SetDstResolution(encodeContext->width,encodeContext->height);
    	swsScaleContext.SetFormat(inputContext->streams[0]->codec->pix_fmt, encodeContext->pix_fmt);
    	initSwsContext(&pSwsContext, &swsScaleContext);	
    	initSwsFrame(pSwsVideoFrame,encodeContext->width, encodeContext->height);
    	int64_t startTime = av_gettime();
    	 while(true)
    	 {
    		auto packet = ReadPacketFromSource();
    		if(av_gettime() - startTime > 10 * 1000 * 1000)
    		{
    			break;
    		}
    		if(packet && packet->stream_index == 0)
    		{
    			if(Decode(inputContext->streams[0],packet.get(),videoFrame))
    			{
    				sws_scale(pSwsContext, (const uint8_t *const *)videoFrame->data,
    					videoFrame->linesize, 0, inputContext->streams[0]->codec->height, (uint8_t *const *)pSwsVideoFrame->data, pSwsVideoFrame->linesize);
    				auto packetEncode = Encode(encodeContext,pSwsVideoFrame);
    				if(packetEncode)
    				{
    					ret = WritePacket(packetEncode);
    					//cout <<"ret:" << ret<<endl;
    				}
    
    			}
    						
    		}
    		
    	 }
    	 cout <<"Get Picture End "<<endl;
    	 av_frame_free(&videoFrame);
    	 avcodec_close(encodeContext);
    	 av_frame_free(&pSwsVideoFrame);
    	 
    	Error:
    	CloseInput();
    	CloseOutput();
    	
    	while(true)
    	{
    		this_thread::sleep_for(chrono::seconds(100));
    	}
    	return 0;
    }
    
    
    

     

    展开全文
  • 起因:学校运河杯报了个项目...因此我用python写了个上位机程序,用pyserial模块实现arduiho和电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。 复制代码 1 import xlwt 2 impor...

    起因:学校运河杯报了个项目,制作一个天气预测的装置。我用arduino跑了BME280模块,用蓝牙模块实现两块arduino主从机透传。但是为了分析,还需要提取出数据。因此我用python写了个上位机程序,用pyserial模块实现arduiho和电脑的串口通讯,再用xlwt模块写入excel表格,用time模块获取时间作为excel的文件名。
    复制代码
    1 import xlwt
    2 import time
    3 import serial
    4 #设置表格样式
    5 def set_style(name,height,bold=False):
    6 style = xlwt.XFStyle()
    7 font = xlwt.Font()
    8 font.name = name
    9 font.bold = bold
    10 font.color_index = 4
    11 font.height = height
    12 style.font = font
    13 return style
    14
    15 #写Excel
    16 def write_excel():
    17 if serial.isOpen():
    18 print (‘串口已打开\n’)
    19 f = xlwt.Workbook()
    20 sheet1 = f.add_sheet(‘arduino_data’,cell_overwrite_ok=True)
    21 row0 = [“temp”,“pres”,“hum”]
    22 time1=time.localtime(time.time())
    23 #写第一行
    24 for i in range(len(row0)):
    25 sheet1.write(0,i,row0[i],set_style(‘Times New Roman’,220,True))
    26 i=1
    27 time.sleep(5)
    28 serial.flushInput()
    29 while True:
    30 try:
    31 size = serial.inWaiting()
    32 if size != 0:
    33 response = serial.read(size) # 读取内容并显示
    34 s=response.decode(‘utf-8’).rstrip(’\r\n’).split(’\t’)
    35 if len(s)!=3:
    36 serial.flushInput()
    37 continue
    38 else:
    39 try:
    40 for j in range(len(s)):
    41 sheet1.write(i,j,int(s[j]),set_style(‘Times New Roman’,220,False))
    42 print(s)
    43 serial.flushInput() # 清空接收缓存区
    44 i = i+1
    45 time.sleep(0.5)
    46 except ValueError:
    47 serial.flushInput()
    48 continue
    49 except KeyboardInterrupt:
    50 time2=time.localtime(time.time())
    51 f.save(r’C:\Users\10020\Desktop\arduino_data{0}.{1}{2:0>2d}.{3:0>2d}.{4:0>2d}-{5}.{6}{7:0>2d}.{8:0>2d}.{9:0>2d}.xls’.format
    52 (time1[1],time1[2],time1[3],time1[4],time1[5],
    53 time2[1],time2[2],time2[3],time2[4],time2[5]))
    54 serial.close()
    55 print(time1)
    56 print(time2)
    57 quit()
    58
    59 if name == ‘main’:
    60 serial = serial.Serial(‘COM3’,9600,timeout=2)
    61 write_excel()
    复制代码

    运行代码后会一直从串口读取arduino的数据,然后写入excel。按Ctrl+c来中止代码进程,此时会在C:\Users\10020\Desktop\arduino_data\这个文件夹下生成以“开始运行时间-结束运行时间”为名称的xls文件。
    代码的运行效果:
    在这里插入图片描述 需要注意的是:
    串口和波特率根据电脑上显示的COM口和设置的arduino波特率决定
    arduino是通过串口发送字节串到电脑,需要编码成utf-8再对字符串进行处理
    每一次接受完数据要清楚数据缓存

    展开全文
  • Android数据保存之文件保存

    千次阅读 2015-07-28 09:34:09
    一篇文章写了Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以key-value形式保存的String类的信息,比较有局限性。...

    前言:

    上一篇文章写了在Android中利用SharedPreferences保存数据,SharedPreferences在保存数据的时候主要是保存一些应用程序的设置信息或者少量的用户信息,并且是以key-value形式保存的String类的信息,比较有局限性。比如你需要保存从网络获取的图片到本地作为缓存数据,并且数量比较大,SharedPreferences就不能满足你的需求了,这个时候就要用到基本上所有平台都会用到的文件保存。
     
    Android中以文件形式把数据保存到磁盘上与其他平台基本上都是类似的,本篇文章将会介绍如何利用java.io.Files的API函数进行文件的读写操作。
     

    选择内部存储还是外部存储:

     
    所有的Android设备有两个文件存储区域:“内部”和“外部”存储。这些名字来自Android的早期,那时大多数设备提供了内置的非易失性存储器(内存),加上一个可移动的存储介质如micro SD卡(外部存储)。现在的Android设备基本上内置的存储空间都很大,比如16g或者32g,这里的16g和32g是指的总共磁盘大小,相当于你新买的电脑一块崭新的硬盘。在手机出厂的时候会在这块磁盘上烧上android系统,android系统会把整个磁盘进行分区,一部分提供给android系统存放系统文件使用,类似windows的系统盘,但是要比windows上权限严格的多,用户是不能随意访问这部分文件的(root除外),这一部分叫做内部存储,剩余的部分用户可以自由使用,手机连上电脑时查看到的也只是这部分文件,叫做外部存储,相当于windows上的其他磁盘(比如D盘),当然有的用户又添加了一张micro-SD卡,这部分也算做外部存储,相当于windows上的外接硬盘吧。
     
    内部存储和外部存储是有区别的,在利用的时候需要注意他们各自的特点:
     

    内部存储:

    • 始终存在可用;
    • 保存的文件默认只能被保存文件的app访问,各个应用之间不可以彼此访问,只能访问自己保存的文件。
    • 当应用被卸载的时候应用保存的文件会被完全清除掉;
    • 如果你想要保存的文件很安全,不会被用户和其他应用读取到,那么你可以选择内部存储这种方式。

    外部存储:

    • 不一定存在,比如有的手机出厂是只有内部存储,没有外部存储,用户自己又没有安装micro-SD卡,这时外部存储是不可用的;
    • 读写完全开放的,所以你保存的数据可能会被用户和可其它程序读取;
    • 卸载应用时只会删除通过getExternalFilesDir()获取到的目录文件;
    • 如果你的文件没有必要控制访问权限,可以允许其它应用或者用户查看,那么外部存储是不错的选择;
     

    注:在默认情况下应用程序安装到内部存储,您可以指定android:installLocation属性在AndroidManifest.xml文件中,这样你的应用程序可以安装在外部存储器。对于用户来说有这个安装选项非常实用,当一些应用程序非常大,内部存储空间不足的时候用户可以把应用安装到外部存储空间。

     

    获取外部存储权限:

    要想在外部存储上存储文件首先要获取外部存储读写权限,权限的声明都是在AndroidManifest.xml文件中,代码如下:
    <manifest ...>
        <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        ...
    </manifest>

    注意:现在所有的应用程序默认都有外部存储的读取权限,你不需要在AndroidManifest.xml文件中进行声明,但是这种默认的权限可能会在以后的Android版本中变更,所以最好还是要在AndroidManifest中显式的进行读取权限声明,免得在以后的版本中程序出现问题,读取权限声明如下:

    <manifest ...>
        <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
        ...
    </manifest>
    另外:
    1、写入权限隐含就有读取权限;
    2、内部存储不需要进行权限声明,应用程序对于内部存储默认就有读写文件的权限;
     

    保存到内部存储:

    文件存储需要创建文件,当把文件保存到内部存储时你可以获取内部存储文件通过下面的两个方法:

    1、File getFilesDir ();

    返回一个文件目录,这个目录下保存应用程序的数据,通过 openFileOutput(String, int) 创建的文件都保存在这个文件目录下。
    这个目录大概是:data/data/包名/files,比如豌豆荚应用程序是:data/data/com.wandoujia.phoenix2/files/
    2、File getCacheDir ();
    返回一个文件目录,这个目录存放的是应用程序缓存文件,当系统空间不足时这部分文件首先会被删除。
    这个目录大概是:data/data/包名/cache,比如豌豆荚应用程序是:data/data/com.wandoujia.phoenix2/cache/
     
    注意:缓存文件的删除不应该依赖系统去删除它,最好的办法是给你的应用缓存设置一个最大值,比如1M,当达到这个值时你应该去删除部分缓存文件以便能再次利用这部分空间。

    当你想要在内部存储写入一个文件时,首先要创建一个文件,可以通过File的构造器,传入上面两个方法获取的路径作为参数,很方便的就能创建一个文件,例如:

    File file = newFile(context.getFilesDir(), filename);

    然后再通过上面的file创建文件流,写入文件,当然你可能更喜欢下面的方式,通过调用 openFileOutput() 创建一个FileOutputStream ,然后写入文件,代码如下:

    String filename ="myfile";
    Stringstring="Hello world!";
    FileOutputStream outputStream;
    
    try{
      outputStream = openFileOutput(filename,Context.MODE_PRIVATE);
      outputStream.write(string.getBytes());
      outputStream.close();
    }catch(Exception e){
      e.printStackTrace();
    }

    当你需要创建一个缓存文件时,你可以通过下面的方式:

    File file = newFile(context.getCacheDir(), filename);

    或者,你会更喜欢下面的方式,通过File的creatTempFile方法在cache目录创建临时文件,文件的后缀是.tmp:

    publicFile getTempFile(Context context,String url){
        File file;
        try{
            String fileName =Uri.parse(url).getLastPathSegment();
            file =File.createTempFile(fileName,null, context.getCacheDir());
        catch(IOException e){
            // Error while creating file
        }
        return file;
    }

    注意:通常情况下你的应用程序内部存储文件是不会被其他应用程序访问到的,因为其他程序的访问首先需要知道你应用的包名和文件名,其次需要获取到你这个文件的访问权限。从技术上来说如果你存放的文件开放了文件读取权限其他应用程序就能读取到,除非是你把文件设置为可读写的,要不然其他程序是无法读取你的文件的,所以文件权限Context.MODE_PRIVATE是必须要设置的。

     

    保存到外部存储:

    保存到外部存储首先要检查外部存储是否存在并有剩余空间,因为外部存储有可能会被拔掉,或者正在连接着电脑,所以当你要在外部存储保存文件的第一步就是检查外部存储是否挂在,可以通过调用getExternalStorageState()方法来查看外置存储是否挂载,如果返回状态是Environment.MEDIA_MOUNTED,则表明已经挂在,并且可以读写。例如下面的代码:
    /* Checks if external storage is available for read and write */
    publicboolean isExternalStorageWritable(){
        String state =Environment.getExternalStorageState();
        if(Environment.MEDIA_MOUNTED.equals(state)){
            returntrue;
        }
        returnfalse;
    }
    
    /* Checks if external storage is available to at least read */
    publicboolean isExternalStorageReadable(){
        String state =Environment.getExternalStorageState();
        if(Environment.MEDIA_MOUNTED.equals(state)||
            Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
            returntrue;
        }
        returnfalse;
    }
    尽管外部存储的文件可以被用户和其他程序访问,但是对于外部存储的文件你需要分两类对待:

    public files:

    这类文件是完全开发的,对于其他应用程序或者用户都可以访问,当你的应用被卸载的时候这部分文件也不会被删除,比如你的拍照程序,用户拍的照片不会因为用户卸载了应用而删除照片,还比如看视频软件,用户下载下来的视频也不能因为卸载二删除。
     

    private files:

    这类文件属于你的应用程序专有,对于其他应用程序无法使用,也没有任何利用价值,虽然这部分文件对用户和其他程序是开放的。这类文件在应用卸载的时候应该被删掉,要不然会造成用户空间的浪费,比如一些缓存文件,地图资源等。
     
    如果你想保存一个公用的文件到外部存储,你可以通过Environment.java中的:
    public static File getExternalStoragePublicDirectory (String type)方法获取外部存储的公共目录,公共目录有几种类型,根据你输入的type返回不同的文件夹,type类型有:

    大家最常见的DIRECTORY_PICTURES目录是:/mnt/sdcard/Pictures,比如你想要存储一张图片,要在外部存放图片的公共目录创建一个图片文件:

    publicFile getAlbumStorageDir(String albumName){
        // Get the directory for the user's public pictures directory. 
        File file =newFile(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), albumName);
        if(!file.mkdirs()){
            Log.e(LOG_TAG,"Directory not created");
        }
        return file;
    }

    如果你想要保存私有类型的数据到外部存储上,可以通过调用Context.java中的:

    public abstract File getExternalFilesDir (String type) 方法获取外部存储路径,路径是:

    /mnt/sdcard/Android/data/data/your_package/type  ,type同上,根据你想要保存的文件类型选择,下面是创建存放私有图片文件的例子:

    publicFile getAlbumStorageDir(Context context,String albumName){
        // Get the directory for the app's private pictures directory. 
        File file =newFile(context.getExternalFilesDir(
                Environment.DIRECTORY_PICTURES), albumName);
        if(!file.mkdirs()){
            Log.e(LOG_TAG,"Directory not created");
        }
        return file;
    }

    如果type中没有你需要的类型,你可以输入null,此时返回的是你的应用程序外部存储目录的私有目录的根目录。

    注意:通过getExternalFilesDir(String type) 方法创建的文件在用户清除数据或者在应用卸载的时候会被系统清除掉,getExternalStoragePublicDirectory(String type) 方法创建的文件则不会。另外,无论你用哪一种方法创建应用程序外部存储文件,注意一下type类型的正确性,以便于系统处理的时候能够正确处理,比如你保存的一个文件是铃声类型,在DIRECTORY_RINGTONES下,系统MediaScanner在进行多媒体扫描的时候会把这个文件分类为铃声而不是音乐。
     

    查询剩余空间:

     
    如果你提前知道你要保存的文件大小,你就可以通过File.getFreeSpace()或者File.getTotalSpace()方法来估算存储空间是否能够容纳,这样就可以避免在没有足够的存储空间时出现IOException。然而有的时候通过File.getFreeSpace()获取的可用空间不一定就有那么多供你使用,如果通过File.getFreeSpace()获取的大小比你的文件大几M或者文件系统有大于10%的剩余空间,这时保存文件可能能够正常进行,否则可能就会保存失败。
     
     
    注意:在你保存文件之前,你不需要检查可用空间,而是在写入文件的时候捕获IOException,用这种方法来代替空间大小的检查,如果你不知道你需要多少空间。
     

    删除文件:

    当你不再需要一个文件时你需要删除它,最直接的方法就是直接调用File.delete()方法来删除。如果这个文件被保存在内部存储上,你也可以调用Context.deleteFile(String name)方法类删除文件。
     
    在用户卸载你的应用的时候Android系统会删除你的一下文件:
    1、所有保存在内部存储的文件;
    2、所有保存在getExternalFilesDir()目录的外部存储文件;
     
    注意:你需要定期手动清理通过getCacheDir()缓存的文件和不再需要的文件。
     

    总结:

    以上讲解了Android系统中文件保存的相关知识,文件保存根据保存位置分为外部存储和内部存储,根据开放性和对应用程序的可用性分为私有类型和公有类型,还有文件保存的方法和一些注意事项,网友们有什么疑惑敬请留言或者回复我的公众号:coder_online。

    大家如果对编程感兴趣,想了解更多的编程知识,解决编程问题,想要系统学习某一种开发知识,我们这里有java高手,C++/C高 手,windows/Linux高手,android/ios高手,请大家关注我的微信公众号:程序员互动联盟or coder_online,大牛在线为您提供服务。

    image010-258x250

    展开全文
  • addres为保存的本地目录名称,包扩xlsx文件名称 address = ['E:train_data\mood_',num2str(mood),'\data_',num2str(people),'_',num2str(mood),'_',num2str(data_len),'.xlsx'] # xlsx文件里保存mat里面的数据 ...
  • C# 中怎么实现将一台电脑上的文件保存到另一台电脑上面,另一台的文件是共享的everyone![,](C:\Users\wangchao\Desktop\QQ截图20141213093647)
  • 又花了一周的时间才正确的把从开发板获取的图像数据转换、编码保存为BMP 图像。 本来是打算开发板,以字符串的形式每次发送512个字节,电脑端再解析出来。但是图片解析一直有问题。最后直接用串口调试助手...
  • Matlab:图像数据保存

    千次阅读 2018-06-17 16:29:19
    下载完一些数据集的做训练的时候,发现了很多不规范的命名,因此,查询了一下图片存储以及改名的方法,学习完后,写下了本篇blog,希望大家喜欢。 读取图像 图像的读取 I=imread(‘pout.tif’); imread是...
  • 电脑关机后清空数据是因为电脑装有还原精灵,可以下载冰点破坏工具、还原精灵破坏工具 、硬盘保护卡破坏...方案二【故障现象】保存在C盘的文件重启电脑后都会消失,只能够保存在其他盘里。 【故障分析与处理】应...
  • Flash数据读取和保存

    千次阅读 2019-05-24 15:05:41
    Flash数据读取和保存的目的是单片机的程序存储区开辟一块空间专门用来保存系统需要记忆的参数和数据,从而完全取代EEROM,达到降低成本和数据保密的目的。该实现方法主要分为四个部分: FLASH数据的读取 ...
  • 文件写入方法 问题提出:现在要保存程序的输出结果,包括...想把这些量保存在txt文件中。   save 函数 将工作空间中的变量写入文件,导出mat文件中。   1. 调用dlmwrite函数 dlmwrite(filename,M) dlmwrite(filename,
  • SDRAM的数据在掉电后可以保存多久?

    千次阅读 2015-02-10 15:12:29
    电脑上的内存SDRAM条取下来,多久以后,内存的数据会消失? 大多数的人认为是几秒钟.
  • 多台个人电脑间的数据同步

    千次阅读 2016-08-10 18:36:59
    相信很多人都同时使用多台计算机:家里,办公室,或者其它秘密地方。当然就算现在没有多台电脑,将来也会有的。多台电脑对应多个硬盘,也对应着...我们 20090720 早间软闻 里征集了数据同步方案,读者好强大,基本
  • Python爬虫(二):爬虫获取数据保存到文件

    万次阅读 多人点赞 2018-10-18 17:33:42
    我爬取到了豆瓣官网的页面代码,我想怎样让爬取到的页面显示出来呀,爬到的数据是html页面代码,不如将爬取到的代码保存到一个文件中,文件命名为html格式,那直接打开这个文件就可以浏览器看到爬取数据的效果...
  • cmd命令行窗口中 执行以下命令exp username/password@"库的位置" file=F:\abc.dmp(本地磁盘 )owner=username
  • 当导出数据进行保存数据的设置时,大家往往选择一下保存路径就直接点击【确定】了,而没有注意保存数据】对话框的下方有【保存类型】的选择,博主的知识梳理模块讲过shapefile和要素类的区别,而之所
  • 七款非常好用的电脑数据恢复软件推荐

    万次阅读 多人点赞 2018-11-03 19:54:02
    目前网络有非常多的数据恢复软件供用户选择,但不同版本的数据恢复软件使用功能不一,且免费的版本较少,本文为大家推荐介绍了几款比较好用的数据恢复软件,需要的朋友可以前来阅读下载。 数据恢复软件哪个比较...
  • Activity运行时数据保存

    万次阅读 2015-04-23 11:43:52
    Android内置了方向感应器的支持,会根据所处的方向自动竖屏和横屏间切换,在电脑上的模拟器切换快捷键为:ctrl+F11/F12。 固定屏幕 有时我们的应用程序仅能横屏 / 竖屏时运行,比如某些游戏,此时我们...
  • 拟实现功能:测试完一组数据保存到excel中去,就添加一行新的数据。 现在的功能:测试完一组数据后就添加一行新的...为什么要这么做,为了防止电脑死机或者断电导致所测得的数据全部丢失。 请问这个该怎么做?
  • 机器学习中,通常拿到的数据并不能直接使用,需要进行预处理,比如...这有点类似电脑游戏中的进度保存。 下面以 notMNIST 数据集为例,介绍如何进行数据的预处理。 1. 导入需要的模块 第一步,先把需要的模块导
  • 查看SharedPreferences中保存数据

    千次阅读 2017-07-25 21:56:29
    Android开发中一般都是将配置文件保存至 SharedPreferences 中,除了使用 getString 等方法获取保存的值之外有什么办法可以直观的看到所保存的值呢?答案是使用 adb 工具。步骤:一、打开命令提示符(Win+R)输入cmd...
  • 下载MySQL Tools for 5.0这个工具,连接服务器的mysql生产数据库,然后进入界面,选择backup,设置基本的配置,选择一个保存路径,就可以实现备份,创建过程如图过程:
  • 等待扫描枪扫码,保存数据当前目录生成文档  // scan.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #pragma warning(disable:4996) #include "string.h" #include "stdlib.h" int main() { ...
  • 有时候我们由于更换电脑,或者数据搬移,需要在电脑之间传输几十G东西,而我们身边并没有高速移动硬盘,那应该怎么办呢? 下面我就为大家介绍一种非常简单可靠并且快速的方法,需要使用到的工具就是一根网线。适用...
  • 通过串口发送到电脑数据如何存储到电脑端为txt格式,用C来写还是用java或者c++
  • U盘插入电脑需要格式化,数据恢复

    万次阅读 2017-11-18 09:37:44
    昨天出门着急,可能U盘忘了弹出,电脑休眠之后直接拔走了,插到别的电脑上直接提示需要格式化磁盘,当时就蒙了,我10G左右的数据啊,又换了一台电脑也是提示格式化磁盘,是不是重新插到以前的电脑就可以了,可是答案...
  • H5保存并读取临时数据

    千次阅读 2017-01-25 16:18:09
    1: 错误:我运行的时候没有显示出数据 ============= H5,APP中,本地存储主要用于客户端存储用户名等简单的用户信息 1: ...web Storage页面存储是H5为存储数据在客户端提供...sessionStorage:保存会话数据 2:
  • sql server2014 导出数据格式为.sql脚本并另一台电脑添加数据库 目录 sql server2014 导出数据格式为.sql脚本并另一台电脑添加数据库 目录 写前面 教程 导出数据 导入数据前面 因为帮别人...
  • Windows延缓写入失败:Windows无法为某盘某文件保存所有数据数据已经丢失。这个错误可能是由于您的计算机硬件或网络连接的失败导致的。 提示“Windows-延缓写入失败”,一般都是由于硬盘坏道故障引起的。可以挂...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 237,521
精华内容 95,008
关键字:

在电脑上如何保存数据