介绍_介绍顺序 - CSDN
精华内容
参与话题
  • ffmpeg函数介绍

    万次阅读 多人点赞 2013-11-15 14:26:38
    本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmpeg的版本号。 ffmpeg本人也...

    本文对在使用ffmpeg进行音视频编解码时使用到的一些函数做一个简单介绍,我当前使用的ffmpeg版本为:0.8.5,因为本人发现在不同的版本中,有些函数名称会有点小改动,所以在此有必要说明下ffmpeg的版本号。

    ffmpeg本人也是刚接触,本文将采用累加的方法逐个介绍我使用到的函数,如有不妥之处,还望谅解!

     

    头文件引入方法:

    extern "C" {

    #include "libavcodec/avcodec.h"

    #include "libavformat/avformat.h"

    #include "libavutil/avutil.h"

    #include "libavutil/mem.h"

    #include "libavutil/fifo.h"

    #include "libswscale/swscale.h"

    };

     

    1 avcodec_init()

    /**

     * Initialize libavcodec.

     * If called more than once, does nothing.

     *

     * @warning This function must be called before any other libavcodec

     * function.

     *

     * @warning This function is not thread-safe.

     */

    void avcodec_init(void);

    // 初始化libavcodec,一般最先调用该函数

    // 引入头文件: #include "libavcodec/avcodec.h"

    // 实现在: \ffmpeg\libavcodec\utils.c

    // 该函数必须在调用libavcodec里的其它函数前调用,一般在程序启动或模块初始化时调用,如果你调用了多次也无所谓,因为后面的调用不会做任何事情.从函数的实现里你可以发现,代码中对多次调用进行了控制.

    // 该函数是非线程安全的

     

    2 av_register_all()

    /**

     * Initialize libavformat and register all the muxers, demuxers and

     * protocols. If you do not call this function, then you can select

     * exactly which formats you want to support.

     *

     * @see av_register_input_format()

     * @see av_register_output_format()

     * @see av_register_protocol()

     */

    void av_register_all(void);

    // 初始化 libavformat和注册所有的muxers、demuxers和protocols,

    // 一般在调用avcodec_init后调用该方法

    // 引入头文件:#include "libavformat/avformat.h"

    // 实现在:\ffmpeg\libavformat\allformats.c

    // 其中会调用avcodec_register_all()注册多种音视频格式的编解码器,并注册各种文件的编解复用器

    // 当然,你也可以不调用该函数,而通过选择调用特定的方法来提供支持

     

    3 avformat_alloc_context()

    /**

     * Allocate an AVFormatContext.

     * avformat_free_context() can be used to free the context and everything

     * allocated by the framework within it.

     */

    AVFormatContext *avformat_alloc_context(void);

    // 分配一个AVFormatContext结构

    // 引入头文件:#include "libavformat/avformat.h"

    // 实现在:\ffmpeg\libavformat\options.c

    // 其中负责申请一个AVFormatContext结构的内存,并进行简单初始化

    // avformat_free_context()可以用来释放该结构里的所有东西以及该结构本身

    // 也是就说使用 avformat_alloc_context()分配的结构,需要使用avformat_free_context()来释放

    // 有些版本中函数名可能为: av_alloc_format_context();

     

    4 avformat_free_context()

    /**

     * Free an AVFormatContext and all its streams.

     * @param s context to free

     */

    void avformat_free_context(AVFormatContext *s);

    // 释放一个AVFormatContext结构

    // 引入头文件:#include "libavformat/avformat.h"

    // 实现在:\ffmpeg\libavformat\utils.c

    // 使用 avformat_alloc_context()分配的结构,采用该函数进行释放,除释放AVFormatContext结构本身内存之外,AVFormatContext中指针所指向的内存也会一并释放

    // 有些版本中函数名猜测可能为: av_free_format_context();

     

    5 AVFormatContext 结构

    /**

     * Format I/O context.

     * New fields can be added to the end with minor version bumps.

     * Removal, reordering and changes to existing fields require a major

     * version bump.

     * sizeof(AVFormatContext) must not be used outside libav*.

     */

    typedef struct AVFormatContext {

        struct AVInputFormat *iformat;

        struct AVOutputFormat *oformat;

        AVIOContext *pb;

        unsigned int nb_streams;

        AVStream **streams;

        char filename[1024]; /**< input or output filename */

        ....

    } AVFormatContext;

    // AVFormatContext在FFMpeg里是一个非常重要的的结构,是其它输入、输出相关信息的一个容器

    // 引入头文件:#include "libavformat/avformat.h"

    // 以上只列出了其中的部分成员

    // 作为输入容器时 struct AVInputFormat *iformat; 不能为空, 其中包含了输入文件的音视频流信息,程序从输入容器从读出音视频包进行解码处理

    // 作为输出容器时 struct AVOutputFormat *oformat; 不能为空, 程序把编码好的音视频包写入到输出容器中

    // AVIOContext *pb: I/O上下文,通过对该变量赋值可以改变输入源或输出目的

    // unsigned int nb_streams; 音视频流数量

    // AVStream **streams; 音视频流

     

    6 AVIOContext 结构

    /**

     * Bytestream IO Context.

     * New fields can be added to the end with minor version bumps.

     * Removal, reordering and changes to existing fields require a major

     * version bump.

     * sizeof(AVIOContext) must not be used outside libav*.

     *

     * @note None of the function pointers in AVIOContext should be called

     *       directly, they should only be set by the client application

     *       when implementing custom I/O. Normally these are set to the

     *       function pointers specified in avio_alloc_context()

     */

    typedef struct {

        unsigned char *buffer;  /**< Start of the buffer. */

        int buffer_size;        /**< Maximum buffer size */

        unsigned char *buf_ptr; /**< Current position in the buffer */

        unsigned char *buf_end; /**< End of the data, may be less than

                                     buffer+buffer_size if the read function returned

                                     less data than requested, e.g. for streams where

                                     no more data has been received yet. */

        void *opaque;           /**< A private pointer, passed to the read/write/seek/...

                                     functions. */

        int (*read_packet)(void *opaque, uint8_t *buf,int buf_size);

        int (*write_packet)(void *opaque, uint8_t *buf,int buf_size);

        int64_t (*seek)(void *opaque, int64_t offset,int whence);

        int64_t pos;            /**< position in the file of the current buffer */

        int must_flush;         /**< true if the next seek should flush */

        int eof_reached;        /**< true if eof reached */

        int write_flag;         /**< true if open for writing */

    #if FF_API_OLD_AVIO

        attribute_deprecated int is_streamed;

    #endif

        int max_packet_size;

        unsigned long checksum;

        unsigned char *checksum_ptr;

        unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);

        int error;              /**< contains the error code or 0 if no error happened */

        /**

         * Pause or resume playback for network streaming protocols - e.g. MMS.

         */

        int (*read_pause)(void *opaque,int pause);

        /**

         * Seek to a given timestamp in stream with the specified stream_index.

         * Needed for some network streaming protocols which don't support seeking

         * to byte position.

         */

        int64_t (*read_seek)(void *opaque,int stream_index,

                             int64_t timestamp, int flags);

        /**

         * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.

         */

        int seekable;

    } AVIOContext;

    // 字节流 I/O 上下文

    // 在结构的尾部增加变量可以减少版本冲突

    // 移除、排序和修改已经存在的变量将会导致较大的版本冲突

    // sizeof(AVIOContext)在libav*.外部不可使用

    // AVIOContext里的函数指针不能直接调用,通常使用avio_alloc_context()函数来设置其中的函数指针

    // unsigned char *buffer: 缓存的起始指针

    // int buffer_size: 缓存的最大值

    // void *opaque: 在回调函数中使用的指针

    // int (*read_packet)(void *opaque, uint8_t *buf,int buf_size): 读文件回调方法

    // int (*write_packet)(void *opaque, uint8_t *buf,int buf_size): 写文件回调方法

    // int64_t (*seek)(void *opaque, int64_t offset,int whence): seek文件回调方法

     

    7 avio_alloc_context()

    /**

     * Allocate and initialize an AVIOContext for buffered I/O. It must be later

     * freed with av_free().

     *

     * @param buffer Memory block for input/output operations via AVIOContext.

     *        The buffer must be allocated with av_malloc() and friends.

     * @param buffer_size The buffer size is very important for performance.

     *        For protocols with fixed blocksize it should be set to this blocksize.

     *        For others a typical size is a cache page, e.g. 4kb.

     * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.

     * @param opaque An opaque pointer to user-specific data.

     * @param read_packet  A function for refilling the buffer, may be NULL.

     * @param write_packet A function for writing the buffer contents, may be NULL.

     * @param seek A function for seeking to specified byte position, may be NULL.

     *

     * @return Allocated AVIOContext or NULL on failure.

     */

    AVIOContext *avio_alloc_context(

                      unsigned char *buffer,

                      int buffer_size,

                      int write_flag,

                      void *opaque,

                      int (*read_packet)(void *opaque, uint8_t *buf,int buf_size),

                      int (*write_packet)(void *opaque, uint8_t *buf,int buf_size),

                      int64_t (*seek)(void *opaque, int64_t offset,int whence));

    // 为I/0缓存申请并初始化一个AVIOContext结构,结束使用时必须使用av_free()进行释放

    // unsigned char *buffer: 输入/输出缓存内存块,必须是使用av_malloc()分配的

    // int buffer_size: 缓存大小是非常重要的

    // int write_flag: 如果缓存为可写则设置为1,否则设置为0

    // void *opaque: 指针,用于回调时使用

    // int (*read_packet): 读包函数指针

    // int (*write_packet): 写包函数指针

    // int64_t (*seek): seek文件函数指针

    8 av_open_input_file()

    /**

     * Open a media file as input. The codecs are not opened. Only the file

     * header (if present) is read.

     *

     * @param ic_ptr The opened media file handle is put here.

     * @param filename filename to open

     * @param fmt If non-NULL, force the file format to use.

     * @param buf_size optional buffer size (zero if default is OK)

     * @param ap Additional parameters needed when opening the file

     *           (NULL if default).

     * @return 0 if OK, AVERROR_xxx otherwise

     *

     * @deprecated use avformat_open_input instead.

     */

    attribute_deprecated int av_open_input_file(AVFormatContext **ic_ptr,constchar *filename,

                           AVInputFormat *fmt,

                           int buf_size,

                           AVFormatParameters *ap);

    // 以输入方式打开一个媒体文件,也即源文件,codecs并没有打开,只读取了文件的头信息.

    // 引入头文件:#include "libavformat/avformat.h"

    // AVFormatContext **ic_ptr 输入文件容器

    //constchar *filename 输入文件名,全路径,并且保证文件存在

    // AVInputFormat *fmt 输入文件格式,填NULL即可

    //int buf_size,缓冲区大小,直接填0即可

    // AVFormatParameters *ap, 格式参数,添NULL即可

    // 成功返回0,其它失败

    // 不赞成使用 avformat_open_input 代替

     

    9 av_close_input_file()

    /**

     * @deprecated use avformat_close_input()

     * Close a media file (but not its codecs).

     * @param s media file handle

     */

    void av_close_input_file(AVFormatContext *s);

    // 关闭使用avformat_close_input()打开的输入文件容器,但并不关系它的codecs

    // 引入头文件:#include "libavformat/avformat.h"

    // 使用av_open_input_file 打开的文件容器,可以使用该函数关闭

    // 使用 av_close_input_file 关闭后,就不再需要使用avformat_free_context 进行释放了

     

    10 av_find_stream_info()

    /**

     * Read packets of a media file to get stream information. This

     * is useful for file formats with no headers such as MPEG. This

     * function also computes the real framerate in case of MPEG-2 repeat

     * frame mode.

     * The logical file position is not changed by this function;

     * examined packets may be buffered for later processing.

     *

     * @param ic media file handle

     * @return >=0 if OK, AVERROR_xxx on error

     * @todo Let the user decide somehow what information is needed so that

     *       we do not waste time getting stuff the user does not need.

     */

    int av_find_stream_info(AVFormatContext *ic);

    // 通过读取媒体文件的中的包来获取媒体文件中的流信息,对于没有头信息的文件如(mpeg)是非常有用的,

    // 该函数通常重算类似mpeg-2帧模式的真实帧率,该函数并未改变逻辑文件的position.

    // 引入头文件:#include "libavformat/avformat.h"

    // 也就是把媒体文件中的音视频流等信息读出来,保存在容器中,以便解码时使用

    // 返回>=0时成功,否则失败

    /***********************************************************/

    1 avcodec_find_decoder()

    /**

     * Find a registered decoder with a matching codec ID.

     *

     * @param id CodecID of the requested decoder

     * @return A decoder if one was found, NULL otherwise.

     */

    AVCodec *avcodec_find_decoder(enum CodecID id);

    // 通过code ID查找一个已经注册的音视频解码器

    // 引入 #include "libavcodec/avcodec.h"

    // 实现在: \ffmpeg\libavcodec\utils.c

    // 查找解码器之前,必须先调用av_register_all注册所有支持的解码器

    // 查找成功返回解码器指针,否则返回NULL

    // 音视频解码器保存在一个链表中,查找过程中,函数从头到尾遍历链表,通过比较解码器的ID来查找

     

    2 avcodec_find_decoder_by_name()

    /**

     * Find a registered decoder with the specified name.

     *

     * @param name name of the requested decoder

     * @return A decoder if one was found, NULL otherwise.

     */

    AVCodec *avcodec_find_decoder_by_name(constchar *name);

    // 通过一个指定的名称查找一个已经注册的音视频解码器

    // 引入 #include "libavcodec/avcodec.h"

    // 实现在: \ffmpeg\libavcodec\utils.c

    // 查找解码器之前,必须先调用av_register_all注册所有支持的解码器

    // 查找成功返回解码器指针,否则返回NULL

    // 音视频解码器保存在一个链表中,查找过程中,函数从头到尾遍历链表,通过比较解码器的name来查找

     

    3 avcodec_find_encoder()

    /**

     * Find a registered encoder with a matching codec ID.

     *

     * @param id CodecID of the requested encoder

     * @return An encoder if one was found, NULL otherwise.

     */

    AVCodec *avcodec_find_encoder(enum CodecID id);

    // 通过code ID查找一个已经注册的音视频编码器

    // 引入 #include "libavcodec/avcodec.h"

    // 实现在: \ffmpeg\libavcodec\utils.c

    // 查找编码器之前,必须先调用av_register_all注册所有支持的编码器

    // 查找成功返回编码器指针,否则返回NULL

    // 音视频编码器保存在一个链表中,查找过程中,函数从头到尾遍历链表,通过比较编码器的ID来查找

     

    4 avcodec_find_encoder_by_name()

    /**

     * Find a registered encoder with the specified name.

     *

     * @param name name of the requested encoder

     * @return An encoder if one was found, NULL otherwise.

     */

    AVCodec *avcodec_find_encoder_by_name(constchar *name);

    // 通过一个指定的名称查找一个已经注册的音视频编码器

    // 引入 #include "libavcodec/avcodec.h"

    // 实现在: \ffmpeg\libavcodec\utils.c

    // 查找编码器之前,必须先调用av_register_all注册所有支持的编码器

    // 查找成功返回编码器指针,否则返回NULL

    // 音视频编码器保存在一个链表中,查找过程中,函数从头到尾遍历链表,通过比较编码器的名称来查找

     

    5 avcodec_open()

    /**

     * Initialize the AVCodecContext to use the given AVCodec. Prior to using this

     * function the context has to be allocated.

     *

     * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),

     * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for

     * retrieving a codec.

     *

     * @warning This function is not thread safe!

     *

     * @code

     * avcodec_register_all();

     * codec = avcodec_find_decoder(CODEC_ID_H264);

     * if (!codec)

     *     exit(1);

     *

     * context = avcodec_alloc_context();

     *

     * if (avcodec_open(context, codec) < 0)

     *     exit(1);

     * @endcode

     *

     * @param avctx The context which will be set up to use the given codec.

     * @param codec The codec to use within the context.

     * @return zero on success, a negative value on error

     * @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close

     */

    int avcodec_open(AVCodecContext *avctx, AVCodec *codec);

    // 使用给定的AVCodec初始化AVCodecContext

    // 引入#include "libavcodec/avcodec.h"

    // 方法: avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(), avcodec_find_decoder() and avcodec_find_encoder() 提供了快速获取一个codec的途径

    // 该方法在编码和解码时都会用到

    // 返回0时成功,打开作为输出时,参数设置不对的话,调用会失败

     
    6 av_guess_format()

    /**

     * Return the output format in the list of registered output formats

     * which best matches the provided parameters, or return NULL if

     * there is no match.

     *

     * @param short_name if non-NULL checks if short_name matches with the

     * names of the registered formats

     * @param filename if non-NULL checks if filename terminates with the

     * extensions of the registered formats

     * @param mime_type if non-NULL checks if mime_type matches with the

     * MIME type of the registered formats

     */

    AVOutputFormat *av_guess_format(constchar *short_name,

                                    constchar *filename,

                                    constchar *mime_type);

    // 返回一个已经注册的最合适的输出格式

    // 引入#include "libavformat/avformat.h"

    // 可以通过 const char *short_name 获取,如"mpeg"

    // 也可以通过 const char *filename 获取,如"E:\a.mp4"

     

    7 av_new_stream()

    /**

     * Add a new stream to a media file.

     *

     * Can only be called in the read_header() function. If the flag

     * AVFMTCTX_NOHEADER is in the format context, then new streams

     * can be added in read_packet too.

     *

     * @param s media file handle

     * @param id file-format-dependent stream ID

     */

    AVStream *av_new_stream(AVFormatContext *s, int id);

    // 为媒体文件添加一个流,一般为作为输出的媒体文件容器添加音视频流

    // 引入 #include "libavformat/avformat.h"

    // 再打开源文件时用户一般不需要直接调用该方法

     
    8 dump_format()

    #if FF_API_DUMP_FORMAT

    /**

     * @deprecated Deprecated in favor of av_dump_format().

     */

    attribute_deprecated void dump_format(AVFormatContext *ic,

                                          int index,

                                          constchar *url,

                                          int is_output);

    #endif

    // 该函数的作用就是检查下初始化过程中设置的参数是否符合规范
    // 有些版本中为 av_dump_format
     
    9 av_set_parameters()

    #if FF_API_FORMAT_PARAMETERS

    /**

     * @deprecated pass the options to avformat_write_header directly.

     */

    attribute_deprecated int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap);

    #endif
    // 设置初始化参数
    // 不赞成跳过该方法,直接调用 avformat_write_header/av_write_header
     
    10 av_write_header()

    #if FF_API_FORMAT_PARAMETERS

    /**

     * Allocate the stream private data and write the stream header to an

     * output media file.

     * @note: this sets stream time-bases, if possible to stream->codec->time_base

     * but for some formats it might also be some other time base

     *

     * @param s media file handle

     * @return 0 if OK, AVERROR_xxx on error

     *

     * @deprecated use avformat_write_header.

     */

    attribute_deprecated int av_write_header(AVFormatContext *s);

    #endif

    // 把流头信息写入到媒体文件中
    // 返回0成功
     

    /**********************************************************/

    1 AVPacket

    typedef struct AVPacket {

        /**

         * Presentation timestamp in AVStream->time_base units; the time at which

         * the decompressed packet will be presented to the user.

         * Can be AV_NOPTS_VALUE if it is not stored in the file.

         * pts MUST be larger or equal to dts as presentation cannot happen before

         * decompression, unless one wants to view hex dumps. Some formats misuse

         * the terms dts and pts/cts to mean something different. Such timestamps

         * must be converted to true pts/dts before they are stored in AVPacket.

         */

        int64_t pts;

        /**

         * Decompression timestamp in AVStream->time_base units; the time at which

         * the packet is decompressed.

         * Can be AV_NOPTS_VALUE if it is not stored in the file.

         */

        int64_t dts;

        uint8_t *data;

        int   size;

        int   stream_index;

        int   flags;

     

    int   duration;

    .

    .

    .

    } AVPacket

    // AVPacket是个很重要的结构,该结构在读媒体源文件和写输出文件时都需要用到
    // int64_t pts; 显示时间戳
    // int64_t dts; 解码时间戳
    // uint8_t *data; 包数据
    // int   size; 包数据长度
    // int   stream_index; 包所属流序号
    // int   duration; 时长
    // 以上信息,如果是在读媒体源文件那么avcodec会初始化,如果是输出文件,用户需要对以上信息赋值
     
    2 av_init_packet()

    /**

     * Initialize optional fields of a packet with default values.

     *

     * @param pkt packet

     */

    void av_init_packet(AVPacket *pkt);

    // 使用默认值初始化AVPacket
    // 定义AVPacket对象后,请使用av_init_packet进行初始化
     
    3 av_free_packet()

    /**

     * Free a packet.

     *

     * @param pkt packet to free

     */

    void av_free_packet(AVPacket *pkt);

    // 释放AVPacket对象
     
    4 av_read_frame()

    /**

     * Return the next frame of a stream.

     * This function returns what is stored in the file, and does not validate

     * that what is there are valid frames for the decoder. It will split what is

     * stored in the file into frames and return one for each call. It will not

     * omit invalid data between valid frames so as to give the decoder the maximum

     * information possible for decoding.

     *

     * The returned packet is valid

     * until the next av_read_frame() or until av_close_input_file() and

     * must be freed with av_free_packet. For video, the packet contains

     * exactly one frame. For audio, it contains an integer number of

     * frames if each frame has a known fixed size (e.g. PCM or ADPCM

     * data). If the audio frames have a variable size (e.g. MPEG audio),

     * then it contains one frame.

     *

     * pkt->pts, pkt->dts and pkt->duration are always set to correct

     * values in AVStream.time_base units (and guessed if the format cannot

     * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format

     * has B-frames, so it is better to rely on pkt->dts if you do not

     * decompress the payload.

     *

     * @return 0 if OK, < 0 on error or end of file

     */

    int av_read_frame(AVFormatContext *s, AVPacket *pkt);

    // 从输入源文件容器中读取一个AVPacket数据包

    // 该函数读出的包并不每次都是有效的,对于读出的包我们都应该进行相应的解码(视频解码/音频解码),

    // 在返回值>=0时,循环调用该函数进行读取,循环调用之前请调用av_free_packet函数清理AVPacket
     
    5 avcodec_decode_video2()

    /**

     * Decode the video frame of size avpkt->size from avpkt->data into picture.

     * Some decoders may support multiple frames in a single AVPacket, such

     * decoders would then just decode the first frame.

     *

     * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than

     * the actual read bytes because some optimized bitstream readers read 32 or 64

     * bits at once and could read over the end.

     *

     * @warning The end of the input buffer buf should be set to 0 to ensure that

     * no overreading happens for damaged MPEG streams.

     *

     * @note You might have to align the input buffer avpkt->data.

     * The alignment requirements depend on the CPU: on some CPUs it isn't

     * necessary at all, on others it won't work at all if not aligned and on others

     * it will work but it will have an impact on performance.

     *

     * In practice, avpkt->data should have 4 byte alignment at minimum.

     *

     * @note Some codecs have a delay between input and output, these need to be

     * fed with avpkt->data=NULL, avpkt->size=0 at the end to return the remaining frames.

     *

     * @param avctx the codec context

     * @param[out] picture The AVFrame in which the decoded video frame will be stored.

     *             Use avcodec_alloc_frame to get an AVFrame, the codec will

     *             allocate memory for the actual bitmap.

     *             with default get/release_buffer(), the decoder frees/reuses the bitmap as it sees fit.

     *             with overridden get/release_buffer() (needs CODEC_CAP_DR1) the user decides into what buffer the decoder

     *                   decodes and the decoder tells the user once it does not need the data anymore,

     *                   the user app can at this point free/reuse/keep the memory as it sees fit.

     *

     * @param[in] avpkt The input AVpacket containing the input buffer.

     *            You can create such packet with av_init_packet() and by then setting

     *            data and size, some decoders might in addition need other fields like

     *            flags&AV_PKT_FLAG_KEY. All decoders are designed to use the least

     *            fields possible.

     * @param[in,out] got_picture_ptr Zero if no frame could be decompressed, otherwise, it is nonzero.

     * @return On error a negative value is returned, otherwise the number of bytes

     * used or zero if no frame could be decompressed.

     */

    int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,

                             int *got_picture_ptr,

                             AVPacket *avpkt);

    // 解码视频流AVPacket
    // 使用av_read_frame读取媒体流后需要进行判断,如果为视频流则调用该函数解码
    // 返回结果<0时失败,此时程序应该退出检查原因
    // 返回>=0时正常,假设 读取包为:AVPacket vPacket 返回值为 int vLen; 每次解码正常时,对vPacket做
    // 如下处理:
    //   vPacket.size -= vLen;
    //   vPacket.data += vLen;
    // 如果 vPacket.size==0,则继续读下一流包,否则继续调度该方法进行解码,直到vPacket.size==0
    // 返回 got_picture_ptr > 0 时,表示解码到了AVFrame *picture,其后可以对picture进程处理
     
    6 avcodec_decode_audio3()

    /**

     * Decode the audio frame of size avpkt->size from avpkt->data into samples.

     * Some decoders may support multiple frames in a single AVPacket, such

     * decoders would then just decode the first frame. In this case,

     * avcodec_decode_audio3 has to be called again with an AVPacket that contains

     * the remaining data in order to decode the second frame etc.

     * If no frame

     * could be outputted, frame_size_ptr is zero. Otherwise, it is the

     * decompressed frame size in bytes.

     *

     * @warning You must set frame_size_ptr to the allocated size of the

     * output buffer before calling avcodec_decode_audio3().

     *

     * @warning The input buffer must be FF_INPUT_BUFFER_PADDING_SIZE larger than

     * the actual read bytes because some optimized bitstream readers read 32 or 64

     * bits at once and could read over the end.

     *

     * @warning The end of the input buffer avpkt->data should be set to 0 to ensure that

     * no overreading happens for damaged MPEG streams.

     *

     * @note You might have to align the input buffer avpkt->data and output buffer

     * samples. The alignment requirements depend on the CPU: On some CPUs it isn't

     * necessary at all, on others it won't work at all if not aligned and on others

     * it will work but it will have an impact on performance.

     *

     * In practice, avpkt->data should have 4 byte alignment at minimum and

     * samples should be 16 byte aligned unless the CPU doesn't need it

     * (AltiVec and SSE do).

     *

     * @param avctx the codec context

     * @param[out] samples the output buffer, sample type in avctx->sample_fmt

     * @param[in,out] frame_size_ptr the output buffer size in bytes

     * @param[in] avpkt The input AVPacket containing the input buffer.

     *            You can create such packet with av_init_packet() and by then setting

     *            data and size, some decoders might in addition need other fields.

     *            All decoders are designed to use the least fields possible though.

     * @return On error a negative value is returned, otherwise the number of bytes

     * used or zero if no frame data was decompressed (used) from the input AVPacket.

     */

    int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,

                             int *frame_size_ptr,

                             AVPacket *avpkt);

    // 解码音频流AVPacket
    // 使用av_read_frame读取媒体流后需要进行判断,如果为音频流则调用该函数解码
    // 返回结果<0时失败,此时程序应该退出检查原因
    // 返回>=0时正常,假设 读取包为:AVPacket vPacket 返回值为 int vLen; 每次解码正常时,对vPacket做
    // 如下处理:
    //   vPacket.size -= vLen;
    //   vPacket.data += vLen;
    // 如果 vPacket.size==0,则继续读下一流包,否则继续调度该方法进行解码,直到vPacket.size==0
     

    展开全文
  • .NET框架简介

    万次阅读 多人点赞 2018-04-20 10:44:24
    初学.NET肯定会有一系列的疑问,比如(以下为自己的疑问): 1) 何为.... 2) 程序集是什么,它是如何在CLR(通用语言运行时)中运行的? 3) C#与VB.NET同属于.NET平台,它们之间的根本联系和区别,为何他们之间的程序...

    初学.NET肯定会有一系列的疑问,比如(以下为自己的疑问):

      1) 何为. NET框架,它都包含哪些东西?

      2)  程序集是什么,它是如何在CLR(通用语言运行时)中运行的?

      3)  C#与VB.NET同属于.NET平台,它们之间的根本联系和区别,为何他们之间的程序集能互相调用(如果创建一种新型的面向. NET的语言,要遵循什么)?

      想要明白如上问题,就需要弄清楚CIL(通用中间语言)、CLR(通用语言运行时)、CTS(通用类型系统)、CLS(通用语言规范)等等的概念,下面是自己看了一些他人的文章后进行的简单总结。


    首先通俗地理解一下.NET平台、.NET框架(Framework)的概念


      “平台”(这里指软件技术平台,下面都指的是这个)就是能够独立运行并自主存在,为其所支撑的上层系统和应用提供运行所依赖的环境。提取一下就是,平台是一个环境。只要符合平台规范的应用都能扔到上面来运行。

      我的通俗理解.NET平台是.NET应用与操作系统之间的一个中介,首先它为.NET应用运行提供了环境,其次它为.NET应用与操作系统之间起到了“解耦”的作用,使得平台上层的应用不依赖与操作系统(的机器指令集)。至于如何解耦,要看它的编译过程,下面会进行解释。


      


      框架就好似某种应用的半成品,是前人根据经验开发的可复用的一组组件,供你选用,然后添血加肉完成你自己的系统。其思想与设计模式有些相似,框架是代码复用,设计模式是设计复用。框架又好似提供的一组规范,它规范应用系统的开发与部署,众所周知的J2EE框架就是定义了13个规范。相类似,NET Framework也提供了很多规范,下面会进行介绍。


      


      粗略地说,一个.NET应用是一个运行于.NET Framework之上的应用程序。或者,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时CLR(通用语言运行时)之上的应用程序。下面开始解决上面提出的问题:


    程序集及其运行


      首先引出两个概念CIL——通用中间语言、CLR——通用语言运行时两个概念(具体概念看百度百科)。

      我们知道,普通的无平台应用(例如:VB应用程序)经过预编译、编译、汇编、链接几个步骤后,最终生成的可执行文件中就已经包含了本地处理器的代码,支持它运行的是操作系统和本地的机器指令集。

      在.NET框架下,高级语言(例C#)经过编译后生成的结果文件被称做程序集,其后缀名是.dll(类库)或.exe(可执行程序,控制台应用程序编译结果)。而程序集并不是二进制机器码,是不能直接运行的,需要经过CLR(通用语言运行时)的即时编译才能生成被操作系统所识别的机器码。

      下面我们用C#和VB.NET分别写两个相同控制台应用程序,都定义一个字符串“hello world”,然后输出:

      C#:


      


      VB.NET:


      


      然后经过编译,分别生成相应的程序集.exe文件,下面我们用vs自带的反编译工具-IL DASM(目录:开始-- >vs2010-- >Windows SDK Tools -- >IL 反汇编程序)分别打开上面生成的程序集。

      C#程序集:


      


      VB.NET程序集:


      


      对比两个程序集文件,可以发现两者的代码几乎完全一致。

      上面用IL DASM打开的文件中的类似汇编的代码即为CIL-通用中间语言。可以看到VB.NET与C#,编译后生成的程序集的格式是相同的;当程序所实现的功能相同时,程序集所包含的CIL代码也是类似的。由此可得下图:


      


      上面提到了程序集(CIL)并不是CPU可以直接执行的本地机器语言。这种语言还需要.NET运行时(CLR)环境的支持,在执行之前,进行一个被称为即时编译的二次编译过程,才能转变成计算机可以识别的指令。


      


      CIL也是一种程序语言,它是比C#低级,比机器码高级的一种中间码语言,类似Java中的.Class文件。从前面截图可知CIL是一种基于堆栈的语言,同时,它提供了class、interface、继承、多态等诸多面向对象的语言特性,因此它又是完全面向对象的语言。如果愿意,甚至可以直接编写CIL代码,并且使用CIL的编译工具IL ASM(IL Assembler,IL汇编程序)来对它进行编译。只不过,和大多数低级语言一样,这种方式会使开发效率会变得很低。

      C#源程序在被编译为程序集以后,就独立于C#,因此程序集可以由其他种类的语言所调用;同时,因为程序集并没有包含本地机器的指令,所以它与具体的机器类型也分隔开了,可以被装有.NET框架的任何机器运行。


    C#与VB.NET的根本联系与区别


      (下文大部分引用一些书籍或博文)

      这里要引入CTS——公共类型系统、CLS——公共语言规范两个概念。

      设想我们如何开发一套类似C#或VB.NET的新的语言(编译后生成CIL代码,可以在.NET环境下运行)?

      要开发的新语言相当于CIL的高级语言版本,所以实际上要做什么并不是由新语言决定的,而是由CIL来决定的。因此,需要一套CIL的定义、规则或标准。这套规则定义了我们的语言可以做什么,不可以做什么,具有哪些特性。这套规则就称作CTS(Common Type System,公共类型系统)。任何满足了这套规则的高级语言就可以称为面向.NET框架的语言。C#和VB.NET不过是微软自己开发的一套符合了CTS的语言,实际上还有很多的组织或团体,也开发出了这样的语言,比如Delphi.Net、FORTRAN等。

      CTS规定了可以在语言中定义的数据类型、访问级别比如Private、Public、Family(C#中为Protected)、Assembly(C#中为internal)、Family and assembly(C#中没有提供实现)、Family or assembly(C#中为protected internal)。

      CTS还定义了一些约束,例如,所有类型都隐式地继承自System.Object类型,所有类型都只能继承自一个基类。从CTS的名称和公共类型系统可以看出,不仅C#语言要满足这些约束,所有面向.NET的语言都需要满足这些约束

      上面提到了,C#并没有提供Family and assembly的实现,C#中也没有全局方法(Global Method)。换言之,C#只实现了CTS 的一部分功能。也就是说,CTS规范了语言能够实现的所有能力,但是符合CTS规范的具体语言实现不一定要实现CTS规范所定义的全部功能。

      显然,由于CIL是.NET运行时所能理解的语言,因此它实现了CTS的全部功能。虽然它是一种低级语言,但是实际上,它所具有的功能更加完整。C#语言和CIL的关系,可以用如下表示:

      


      

      既然已经理解了CTS是一套语言的规则定义,就可以开发一套语言来符合CTS了。假设这个语言叫做B#,它所实现的CTS非常有限,仅实现了其中很少的一部分功能,它与CTS和C#语言的关系可能如下:


      


      那么现在就有一个问题:由C#编写的程序集,能够引用由B#编写的程序集吗?答案显然是不能。虽然C#和B#同属于CTS旗下,但是它们并没有共通之处。因此,虽然单独的B#或C#程序可以完美地在.NET框架下运行,但是它们之间却无法相互引用。

      如果B#项目期望其他语言类型的项目能够对它进行引用,就需要B#中公开的类型和功能满足C#语言的特性,即它们需要有共通之处。B#中不公开的部分(private、internal、protected)是不受影响的,可以使用独有的语言特性,因为这些不公开的部分本来就不允许外部进行访问。因此,如果B#想要被C#所理解和引用,它公开的部分就要满足C#的一些规范,此时,它与CTS和C#语言的关系就会变成如下:


      


      如果世界上仅有C#和N#两种语言就好办了,把它们共同的语言特性提取出来,然后要求所有公开的类型都满足这些语言特性,这样C#和N#程序集就可以相互引用了。可问题是:语言类型有上百种之多,并且.NET的设计目标是实现一个开放的平台,不仅现有的语言经过简单修改就可以运行在.NET框架上,后续开发的新语言也可以,而新语言此时并不存在,如何提取出它的语言特性?因此又需要一套规范和标准来定义一些常见的、大多数语言都共有的语言特性。

      对于未来的新语言,只要它公开的部分能够满足这些规范,就能够被其他语言的程序集所使用。这个规范就叫做CLS (Common Language Specification,公共语言规范)。很明显,CLS是CTS的一个子集。那么VB.NET、C#、B#的关系就可表达为:


      


      如果利用C#开发的一个程序集的公开部分仅采用了CLS中的特性,那么这个程序集就叫做CLS兼容程序集(CLScompliant assembly)。显然,对于上面提到的FCL框架类库,其中的类型都符合CLS,仅有极个别类型的成员不符合CLS,这就保证了所有面向.NET的语言都可以使用框架类库中的类型。

      满足CLS就是要求语言特性要一致,那么什么叫做语言特性?这里给出几个具体的语言特性:是否区分大小写,标识符的命名规则如何,可以使用的基本类型有哪些,构造函数的调用方式(是否会调用基类构造函数),支持的访问修饰符等。

      那么我们如何检验程序集是否符合CLS呢?.NET为我们提供了一个特性CLSCompliant,便于在编译时检查程序集是否符合CLS。我们来看下面一个例子:


      


      可以注意到,在CLSTest类的前面为程序集加上了一个CLSCompliant特性,表明这个程序集是CLS兼容的。但是,有三处并不满足这个要求,因此编译器给出了警告信息。这三处是:

      •不能以大小写来区分成员,因此字段name和方法Name()不符合CLS。

      •方法的返回类型和参数类型必须是CLS兼容的,uint和sbyte类型并非CLS兼容,因此GetValue()和SetValue()方法不符合CLS。

      •标识符的命名不能以下划线“_”开头,因此属性_MyProperty不符合CLS。

      还会注意到,编译器给出的只是警告信息,而非错误信息,因此可以无视编译器的警告,不过这个程序集只能由其他C#语言编写的程序集所使用。


    总结


             我们对.NET框架的第一感觉就是,.NET框架所提供的庞大类库及编写代码所采用的C#语言等,实际上远不止这些。还包含许多的内容,例如CLI、CIL、CTS、CLS、CLR、JIT、BCL、FCL等,这些内容在《.NET之美》这本书中都进行了深入浅出的讲解,对初学者很实用。如果想真正的理解.NET,仅仅会编码是远远不够得,上面这些东西才是根本

    展开全文
  • 这里将自己做的一个PPT纪录一下,根据斯坦福大学CS234 lecture 5 整理而来Some of the content for this lecture is borrowed from Hugo Larochelle 神经网络相对于训练集:太小(欠拟合),找到的规律模型未能够很...
    这里将自己做的一个PPT纪录一下,根据斯坦福大学CS234 lecture 5 整理而来

    Some of the content for this lecture is borrowed from Hugo Larochelle 




    神经网络相对于训练集:太小(欠拟合),找到的规律模型未能够很好的捕捉数据特征,不能很好的拟合数据;太大(过拟合),记住的规律太多,太具体死板地记住训练集,不够抽象。




    单个神经元的作用:把一个n纬的向量空间用一个超平面分成两部分(称之为判断边界),给定一个输入向量,神经元能判断出这个向量位于超平面的哪一边。b+wTx=0 就是超平面方程。

    x1,x2,x3.....是输入特征向量的各个分量

    w1,w2,w3....是各神经元各突触的权值

    b:神经元偏置



    二维可视化激活函数表示图,W向量决定两类情况范围区别的基本方向,b变大,超平面会向相反的方向移动。

    图中红色虚线就是超平面,w方向和超平面垂直




    Sigmoid 激活函数,特点:可以将输出压缩到0-1的范围;总是正数;有界;严格递增

    缺点:会出现梯度消失,这个函数的导数是g(a)(1-g(a)),最大值是1/4,所以每一层向前传递都会至少3/4的梯度损失。

    激活函数的意义:

    如果不加激活函数,无论多少的层隐层,最终的结果还是原始输入的线性变化,这样一层隐层就能达到效果,就没有多层感知器的意义了,所以每个隐层都配有激活函数,提供非线性的变化。





    ReLU激活函数,修正线性激活函数

    特点:非负;将神经元变得稀疏;没上界;严格递增

    优点:可以防止梯度消失,其导数是1



    前馈神经网络,是指链接图无闭环或者回路。单隐层神经网络,只有一个隐藏层。

    偏置单元无输入,w(1) 3*3 , w(2) 1*3 , S(l) 表示第l层节点个数,不包括偏置单元。

    w(1)i,j  表示第一层的 j 单元和第二层的 i 单元链接权重





    这个例子可以解释XOR抑或门


    前向传播的例子





    扩展到多个隐藏层




    通用近似定理:单隐层神经网络如果有线性输出层,可以以任何精度逼近任何连续函数,只要隐层神经元的个数足够多。




    神经网络调参的形象比喻,磨合就是不断找到更好的参数值



    theta 是所有参数的集合

    关于训练样本集的平均损失。 

    经验风险最小化(empirical risk minimization,ERM)的策略认为,经验风险最小的模型是最优的模型。根据这一策略,按照经验风险最小化求最优模型就是求解最优化问题: 


    当样本容量足够大时,经验风险最小化能保证有很好的学习效果,在现实中被广泛采用。例如,极大似然估计(MLE)就是经验风险最小化的一个例子。当模型是条件概率分布,损失函数是对数损失函数时,经验风险最小化就等于极大似然估计。 

    但是,当样本容量很小时,经验风险最小化学习的效果就未必很好,会产生过拟合现象。而结构风险最小化(structural risk minimization, SRM)是为了防止过拟合而提出的策略。结构风险最小化等价于正则化。结构风险在经验风险的基础上加上表示模型复杂度的正则化项。在假设空间、损失函数以及训练集确定的情况下,结构风险的定义是:

    其中,J(f)为模型的复杂度,是定义在假设空间上的泛函。模型f越复杂,复杂度J(f)就越大。也就是说,复杂度表示了对复杂模型的惩罚。结构风险小的模型往往对训练数据和未知的测试数据都有较好的预测。比如,贝叶斯估计中的最大后验概率估计(MAP)就是结构风险最小化的例子。当模型是条件概率分布,损失函数是对数损失函数,模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大后验概率估计。 

    结构风险最小化的策略认为结构风险最小的模型是最优的模型。所以求解模型,就是求解最优化问题:





    随机梯度下降:

    不直接计算梯度精确值,而是用梯度无偏差估计来替代梯度,随机化整个数据集,每次迭代仅选择一个训练样本去计算代价函数的梯度,然后更新参数,优点是计算速度很快,缺点是精度受到影响





    前向传播和反向传播图示。

    下面是反向传播的例子,详细计算过程:









    模型选择,网格搜索或者随机搜索,网格搜索就是尝试所有的参数组合,随机组合就是随机尝试几组参数组合,选择这里面最好的组合





    在上述的批梯度的方式中每次迭代都要使用到所有的样本,对于数据量特别大的情况,如大规模的机器学习应用,每次迭代求解所有样本需要花费大量的计算成本。是否可以在每次的迭代过程中利用部分样本代替所有的样本呢?基于这样的思想,便出现了mini-batch的概念。 

      假设训练集中的样本的个数为1000,则每个mini-batch只是其一个子集,假设,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。



    momentum是梯度下降法中一种常用的加速技术。对于一般的SGD,其表达式为x \leftarrow  x-\alpha \ast dx,x沿负梯度方向下降。而带momentum项的SGD则写生如下形式:
    v=\beta \ast v -a\ast dx\\
    x \leftarrow  x+v
    其中\beta即momentum系数,通俗的理解上面式子就是,如果上一次的momentum(即v)与这一次的负梯度方向是相同的,那这次下降的幅度就会加大,所以这样做能够达到加速收敛的过程。





    解决过拟合:无监督预训练;dropout



    解码器、编码器





    dropout:模型训练时,随机让网络某些隐藏层结点的权重不工作,不工作的结点可暂时认为不是网络结构的一部分,但是权重保留下来,不更新,因为下次样本输入时又可能会继续工作。

    能减少神经元之间的共适性,一个神经元不能依赖其他特定的神经元,所以不得不去学习随机子集神经元间复样性的有用连接。

    即:减少权重连接,增加网络模型在缺失个体连接信息情况下的鲁棒性。




    欠拟合:BN,加速训练,解决梯度消失的问题





    展开全文
  • MODIS数据介绍

    万次阅读 2018-07-21 15:16:11
    转自:... 一、Modis数据资源总体介绍 &nbsp;1999年2月18日,美国成功地发射了地球观测系统(EOS)的第一颗先进的极地轨道环境遥感卫星Terra。它的主要目标是实现...

    转自:http://blog.sina.com.cn/s/blog_53e9bb570101jv55.html

    一、Modis数据资源总体介绍

     1999218日,美国成功地发射了地球观测系统(EOS)的第一颗先进的极地轨道环境遥感卫星Terra。它的主要目标是实现从单系列极轨空间平台上对太阳辐射、大气、海洋和陆地进行综合观测,获取有关海洋、陆地、冰雪圈和太阳动力系统等信息,进行土地利用和土地覆盖研究、气候季节和年际变化研究、自然灾害监测和分析研究、长期气候变率的变化以及大气臭氧变化研究等,进而实现对大气和地球环境变化的长期观测和研究的总体(战略)目标。200254日成功发射Aqua星后,每天可以接收两颗星的资料。 
        搭载在TerraAqua两颗卫星上的中分辨率成像光谱仪(MODIS)是美国地球观测系统(EOS)计划中用于观测全球生物和物理过程的重要仪器。它具有36个中等分辨率水平 (0.25um~1um)的光谱波段,每1-2天对地球表面观测一次。获取陆地和海洋温度、初级生产率、陆地表面覆盖、云、汽溶胶、水汽和火情等目标的图像。 
        本网站提供的MODIS陆地标准产品来自NASA的陆地过程分布式数据档案中心(The Land Processes Distributed Active Archive Center,LP DAAC/NASA)。包括:基于Terra星和Aqua星数据的地表反射率(250m,daily;500m,daily;250m,8days;500m,8day)、地表温度(1000m,daily;1000m,8days;5600m,daily)、地表覆盖(500m,96days;1000m,yearly)、植被指数NDVI&EVI250m,16daily;500m,16days;1000m,16days;1000m,monthly;、温度异常/火产品(1000m,daily;1000m,8days)、叶面积指数LAI/光合有效辐射分量FPAR1000m,8days)、总初级生产力GPP1000m,8days)。 
        本网站提供的所有MODIS陆地标准产品的格式为HDF-EOS,数据组织方式为10°经度*10°纬度的分片(TILE)方式。

    二、MODIS数据特点及技术指标

    1.概况

    MODIS全称Moderate-Resolution Imaging Spectroradiometer,即中分辨率成像光谱仪。1998MODIS机载模型器安装到EOS-AM(上午轨道)和PM(下午轨道)系列卫星上,从199912月正式向地面发送数据。MODISNASA地球行星使命计划中总数为15颗。

    2. MODIS数据的特点

    MODIS数据主要有四个特点: 
        1)全球免费:NASAMODIS数据实行全球免费接收的政策(TERRA卫星除MODIS外的其他传感器获取的数据均采取公开有偿接收和有偿使用的政策),这样的数据接收和使用政策对于目前我国大多数科学家来说是不可多得的、廉价并且实用的数据资源; 
        2)光谱范围广:MODIS数据涉及波段范围广(共有36个波段,光谱范围从0.4um-14.4um),数据分辨率比NOAA-AVHRR有较大的进展(辐射分辨率达12bits,其中两个通道的空间分辨率达250m5个通道为500m,另29个通道为1000m)。这些数据均对地球科学的综合研究和对陆地、大气和海洋进行分门别类的研究有较高的实用价值; 
        3)数据接收简单:MODIS接收相对简单,它利用X波段向地面发送,并在数据发送上增加了大量的纠错能力,以保证用户用较小的天线(仅3m)就可以得到优质信号; 
        4)更新频率高:TERRAAQUA卫星都是太阳同步极轨卫星,TERRA在地方时上午过境,AQUA在地方时下午过境。TERRAAQUA上的MODIS数据在时间更新频率上相配合,加上晚间过境数据,对于接收MODIS数据来说可以得到每天最少2次白天和2次黑夜更新数据。这样的数据更新频率,对实时地球观测和应急处理(例如森林和草原火灾监测和救灾)有较大的实用价值。

    3.MODIS数据的技术指标

    项目

    指标

    轨道

    705km,降轨上午10: 30过境,升轨下午1: 30过境,太阳同步,近极地圆轨道

    扫描频率

    每分钟20.3转,与轨道垂直

    测绘宽带

    2330km x 10km

    望远镜

    直径17.78cm

    体积

    1.0m X 1.6m X 1.0m

    重量

    250g

    功耗

    225w

    数据率

    11Mbit/s

    量化

    12bit

    星下点空间分辨率

    250m,500m,1000m

    设计寿命

    5年

     

    4.MODIS数据的波段分布特征

    波段

    波谱范围(nm)

    信噪比

    主要用途

    分辨率(m)

    1

    620-670

    128

    陆地/云边界

    250

    2

    841-876

    201

    3

    459-479

    243

    陆地/云特性

    500

    4

    545-565

    228

    5

    1230-1250

    74

    6

    1628-1652

    275

    7

    2105-2155

    110

    8

    405-420

    880

    海洋颜色/浮游 
    植物/生物化学

    1000

    9

    43848

    838

    10

    483-493

    802

    11

    526-536

    754

    12

    546-556

    750

    13

    662-672

    910

    14

    673-683

    1087

    15

    743-753

    586

    16

    862-877

    516

    17

    890-920

    167

    大气水蒸气

    18

    931-941

    57

    19

    915-965

    250

    20

    3.660-3.840

    0.05

    地表/云温度

    21

    3.929-3.989

    2.00

    22

    3.929-3.989

    0.07

    23

    4.020-4.080

    0.07

    24

    4.433-4.498

    0.25

    大气温度

    25

    4.482549

    0.25

    26

    1360-1390

    150

    卷云

    27

    6.535-6.895

    0.25

    水蒸气

    28

    7.175-7.475

    0.25

    29

    8.400-8,700

    0.25

    30

    9.580-9.880

    0.25

    臭氧

    31

    10.780-11.280

    0.05

    地表/云温度

    32

    11.770-12.270

    0.05

    33

    13.185-13.485

    0.25

    云顶高度

    34

    13.485-13.785

    0.25

    35

    13.785-14.085

    0.25

    36

    14.085-14.385

    0.35

    3.MODIS数据产品分级

    按数据产品特征划分:主要产品包括校正数据产品、陆地数据产品、海洋数据产品和大气数据产品;若按处理级别划分,又可以分为以下6种: 
        0级产品:也称原始数据; 
        1级产品:指L1A数据,已经被赋予定标参数; 
        2级产品:指L1B级数据,经过定标定位后数据,本系统产品是国际标准 的EOS-HDF格式。包含所有波段数据,可能是应用比较广泛的一类数据。; 
        3级产品:在1B数据的基础上,对由遥感器成像过程产生的边缘畸变(Bowtie效应)进行校正,产生L3级产品; 
        4级产品:由参数文件提供的参数,对图像进行几何纠正,辐射校正,使图像的每一点都有精确的地理编码、反射率和辐射率。L4级产品的MODIS图像进行不同时相的匹配时,误差小于1个像元。该级产品是应用级产品不可缺少的基础; 
        5级及以上产品:根据各种应用模型开发L5级产品。  

    MODIS数据介绍

    MODIS数据介绍

    MODIS数据介绍

    MODIS数据介绍

    三.MODIS Tile产品数据组织方式

     本网站提供的MODIS陆地标准产品数据都采用TILE类型进行组织即以地球为参照系, 采用了SINISIN,正弦曲线投影) 地球投影系统,将全球按照10°经度*10°纬度(1200KM*1200KM)的方式分片(如下图),全球陆地被分割为600多个Tile,并对每一个Tile赋予了水平编号和垂直编号。左上角的编号为(00)右下角的编号为(3517)。


    MODIS数据介绍

    四.MODIS 命名规则

     MODIS文件名的命名遵循一定的规则,通过文件名,可以获得很多关于此文件的详细信息,比如:文件名    MOD09A1.A2006001.h08v05.005.2006012234657.hdf     MOD09A1 –产品缩写     .A2006001 – 数据获得时间(A-YYYYDDD)     .h08v05 – 分片标示(水平XX,垂直YY)     .005 – 数据集版本号     .2006012234567 – 产品生产时间(YYYYDDDHHMMSS)     .hdf – 数据格式(HDF-EOS)

     

    五.MODIS 时间分辨率

     根据实际情况不同,本网站提供的MODIS陆地标准数据产品具有不同的时间分辨率,主要包括: 

        每日产品(daily 
        8天合成产品(8-Day 
        16天合成产品(16-Day 
        月合成产品(Monthly 
        季度产品(Quarterly 
        年产品(Yearly

    六.MODIS 空间分辨率

    MODIS仪器获得的数据有3个空间分辨率: 
        Bands 1–2 – 250 
        Bands 3–7 – 500 
        Bands 8–36 – 1000 
        本网站提供的MODIS陆地标准数据产品分为4种不同的空间分辨率,分别如下: 
        250 
        500 
        1000 
        5600 (0.05).

    七.MODIS产品处理级别

    本网站提供的MODIS陆地标准数据产品都为L2或者更高级别: 
        Level-2: derived geophysical variables at the same resolution and location as level-1 source data (swath products) 
        Level-2G: level-2 data mapped on a uniform space-time grid scale (Sinusoidal) 
        Level-3: gridded variables in derived spatial and/or temporal resolutions 
        Level-4: model output or results from analyses of lower-level data

    展开全文
  • 区块链及以太坊入门介绍

    千次阅读 2018-09-05 08:37:29
    一、区块链入门介绍 阮一峰写的挺好的: http://www.ruanyifeng.com/blog/2017/12/blockchain-tutorial.html 区块链技术:是一个去中心化的数据库,是分布式数据存储、点对点传输、共识机制、加密算法等计算机...
  • MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,...
  • ResNet介绍

    万次阅读 多人点赞 2018-07-10 19:37:33
    ResNet介绍1 简要概括 ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,...
  • java开发面试 自我介绍 与 项目介绍是重点

    万次阅读 多人点赞 2017-02-23 20:05:23
    第一句话请关下门,第二句话先做一下自我介绍,完了让我介绍项目以及我所做的部分。这几点是每家公司都会问的问题,但只有这家只问这两个问题。所以足见,多花心思在自我介绍和项目介绍上准没错。 那么 自我介绍应该...
  • 前端面试 两分钟自我介绍

    万次阅读 多人点赞 2019-05-10 15:18:07
    你好,我是xxx,x x年6月毕业于xxx,专业是xxx。 我的前端兴趣来源于大学期间参加了xxx大会,在会议上认识很多厉害的大牛,看到很炫酷的css特效,颠覆了我对前端只是网页的概念,因此确定了职业方向。...
  • 程序员自我介绍——英文版

    万次阅读 2016-11-16 08:04:19
    Thank you for giving me this opportunity for this (phone) interview. My Chinese name is XXX and you can call me XXX which is my English name . I’m from XXX ,a city in XXX province....
  • Html自我介绍

    万次阅读 2018-05-07 21:48:14
    &lt;!doctype html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8"&gt; &lt;title&gt;兰博基尼&... background-color: rgba(217,95,97,
  • 软件测试面试指导-问题一:自我介绍

    万次阅读 多人点赞 2018-03-23 19:03:22
    面试问题参考第一问,95%都会问到请简单的做过自我介绍吧?几点去说明1,个人的基本信息,扬长避短。1,年纪太大与太小,都不需要主动去说明比如我年纪只有21岁例子:面试官您好,我叫***,来自于哪里,一直从事软件...
  • 软件测试面试必考题:自我介绍

    万次阅读 多人点赞 2019-01-14 21:05:05
    请简单的做个自我介绍吧~ 分以下几点说明。   一、个人的基本信息,扬长避短   1、年纪太大与太小,都不需要主动去说明。 比如我年纪只有21岁 例子:面试官您好,我叫***,来自于哪里,从事软件测试工作...
  • 华为面试自我介绍

    万次阅读 2016-10-22 19:41:46
    面试官您好,我叫*,来自南京航空航天大学,是即将17年毕业的硕士研究生,研究生期间主要做图像处理、机器视觉方面的工作,所以我的求职意向是媒体算法。我的本科也是在南京航空航天大学理学院读的,专业是信息与...
  • 程序员自我介绍

    万次阅读 2019-03-20 22:40:21
    一个常规的面试,寒暄之后面试官提出的第一个问题几乎千篇一律:“请您简单地做一下自我介绍”。有些被面试者都会问:简历中情况已经写得很清楚了,这是否多此一举? 要回答这个问题,首先搞清楚为什么面试官要请...
  • 软件工程师自我介绍

    万次阅读 2019-11-09 12:06:55
    2、我做过什么(大体介绍一下项目,以及项目中使用到的技术) 3、我做成过什么 4、我想做什么 各位前辈,大家好,我叫XXX,毕业于重庆理工大学,计算机科学与技术专业,以前在学校学的是.net,在学校实验室跟老师...
  • 软件测试面试的自我介绍

    万次阅读 多人点赞 2019-04-13 18:27:27
    面试官,你好,我叫Jayce,16年本科毕业,从事软件测试将近3年的时间。在此期间做过一些项目也积累过一些经验,能够独立地完成软件测试流程的一个工作。我之前主要做过的是功能测试,web自动化测试、app专项测试、...
  • 深度学习资料整理

    万次阅读 2016-04-20 16:14:20
    本文是转载了别人的博客,然后还加上了自己到淘宝上买的百度云盘资料(还包括一些数据挖掘,大数据之类的教程)。 编者按:本文收集了百来篇关于...介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机、神经
  • 设计一个自我介绍简单页面

    万次阅读 2019-02-22 16:41:39
    1.在网页标题栏中显示“自我介绍”文本信息。 2.以1级标题的形式显示“自我介绍”文本信息。 3.以定义列表的形式介绍个人基本情况,包括姓名、性别、住址、兴趣或爱好。 4.在信息列表下面以图像的形式插入个人的...
  • 面试的时候,如何做自我介绍

    万次阅读 2018-11-20 16:53:09
    找工作过程中,遇到的第一个面试问题就是:自我介绍。那么,自我介绍的时候,应该先说些什么?中间怎么说?最后怎么结尾?主要说那些内容比较好?   通常面试官会根据你的自我介绍来展开问后面的问题。比如你在...
1 2 3 4 5 ... 20
收藏数 4,708,368
精华内容 1,883,347
关键字:

介绍