精华内容
下载资源
问答
  • 重采样

    2020-09-07 17:49:57
    重采样分为上采样和下采样,下采样时需要对信号进行抽取,上采样时需要对信号进行插值。 减少抽取率以去掉过多数据的过程称为信号的抽取;增加抽样率以增加数据的过程称为信号的插值。 抽取、插值或二者结合使用...

    重采样分为上采样和下采样,下采样时需要对信号进行抽取,上采样时需要对信号进行插值。

    减少抽取率以去掉过多数据的过程称为信号的抽取;增加抽样率以增加数据的过程称为信号的插值。

    抽取、插值或二者结合使用可以实现信号抽样率的转换。

    参考https://blog.csdn.net/u012222949/article/details/85330352

     

    展开全文
  • 粒子群包括随机重采样、多项式重采样、系统重采样、残差重采样程序
  • 揭示图像重采样的痕迹和反取证的重采样
  • python_批量重采样

    2018-07-20 12:06:46
    python_批量重采样 python_批量重采样 python_批量重采样 python_批量重采样
  • I . FFMPEG 播放视频流程 II . FFMPEG 音频重采样流程 III . FFMPEG 音频重采样 IV . FFMPEG 初始化音频重采样上下文 SwrContext ... FFMPEG 音频重采样输出的重采样数据字节数计算 X . FFMPEG 音频重采样部分代码总结



    I . FFMPEG 播放视频流程



    FFMPEG 播放视频流程 : 视频中包含图像和音频 ;


    ① FFMPEG 初始化 : 参考博客 【Android FFMPEG 开发】FFMPEG 初始化 ( 网络初始化 | 打开音视频 | 查找音视频流 )

    ② FFMPEG 获取 AVStream 音视频流 : 参考博客 【Android FFMPEG 开发】FFMPEG 获取 AVStream 音视频流 ( AVFormatContext 结构体 | 获取音视频流信息 | 获取音视频流个数 | 获取音视频流 )

    ③ FFMPEG 获取 AVCodec 编解码器 : 参考博客 【Android FFMPEG 开发】FFMPEG 获取编解码器 ( 获取编解码参数 | 查找编解码器 | 获取编解码器上下文 | 设置上下文参数 | 打开编解码器 )

    ④ FFMPEG 读取音视频流中的数据到 AVPacket : 参考博客 【Android FFMPEG 开发】FFMPEG 读取音视频流中的数据到 AVPacket ( 初始化 AVPacket 数据 | 读取 AVPacket )

    ⑤ FFMPEG 解码 AVPacket 数据到 AVFrame ( 音频 / 视频数据解码 ) : 参考博客 【Android FFMPEG 开发】FFMPEG 解码 AVPacket 数据到 AVFrame ( AVPacket->解码器 | 初始化 AVFrame | 解码为 AVFrame 数据 )

    ⑥ FFMPEG AVFrame 图像格式转换 YUV -> RGBA : 参考博客 【Android FFMPEG 开发】FFMPEG AVFrame 图像格式转换 YUV -> RGBA ( 获取 SwsContext | 初始化图像数据存储内存 | 图像格式转换 )

    ⑦ FFMPEG ANativeWindow 原生绘制 准备 : 参考博客 【Android FFMPEG 开发】FFMPEG ANativeWindow 原生绘制 ( Java 层获取 Surface | 传递画布到本地 | 创建 ANativeWindow )



    II . FFMPEG 音频重采样流程



    FFMPEG 音频重采样流程 :


    〇 视频播放操作 : FFMPEG 环境初始化 , 获取 AVStream 音视频流 , 获取 AVCodec 编解码器 , 读取音视频流中的数据到 AVPacket , 解码 AVPacket 数据到 AVFrame , AVFrame 图像格式转换 YUV -> RGBA , ANativeWindow 原生绘制 ;


    〇 音频播放操作 : FFMPEG 环境初始化 , 获取 AVStream 音视频流 , 获取 AVCodec 编解码器 , 读取音视频流中的数据到 AVPacket , 解码 AVPacket 数据到 AVFrame , 然后进行下面的操作 , 音频重采样 ;


    ① 初始化音频重采样上下文 : struct SwrContext *swr_alloc_set_opts( … ) , int swr_init(struct SwrContext *s)

    SwrContext *swrContext = swr_alloc_set_opts(
            0 ,                     //现在还没有 SwrContext 上下文 , 先传入 0
            //输出的音频参数
            AV_CH_LAYOUT_STEREO ,   //双声道立体声
            AV_SAMPLE_FMT_S16 ,     //采样位数 16 位
            44100 ,                 //输出的采样率
            //从编码器中获取输入音频格式
            avCodecContext->channel_layout, //输入的声道数
            avCodecContext->sample_fmt,     //输入的采样位数
            avCodecContext->sample_rate,    //输入的采样率
            0, 0    //日志参数 设置 0 即可
            );
            
    swr_init(swrContext);
    

    ② 计算积压的延迟数据 : int64_t swr_get_delay(struct SwrContext *s, int64_t base)

    int64_t delay = swr_get_delay(swrContext , avFrame->sample_rate);
    

    ③ 计算本次重采样后的样本个数 : int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const

    int64_t out_count = av_rescale_rnd(
            avFrame->nb_samples + delay, //本次要处理的数据个数
            44100,
            avFrame->sample_rate ,
            AV_ROUND_UP );
    

    ④ 音频重采样 : int swr_convert(struct SwrContext *s, uint8_t **out, int out_count, const uint8_t **in , int in_count)

    int samples_per_channel_count = swr_convert(
            swrContext ,
            &data,
            out_count ,
            (const uint8_t **)avFrame->data, //普通指针转为 const 指针需要使用 const_cast 转换
            avFrame->nb_samples
            );
    

    ⑤ 计算音频重采样字节数 : 音频重采样 swr_convert ( ) 返回值 samples_per_channel_count 是 每个通道的样本数 ;

    pcm_data_bit_size = samples_per_channel_count * 2 * 2;
    


    III . FFMPEG 音频重采样



    1 . 音频解码 : FFMPEG 从 AVStream 音频流中读取 AVPacket 压缩的编码数据包 , 然后进行解码 , 获得解码后的数据 , 封装在 AVFrame 中 ;


    2 . 音频重采样 : 解码后的 AVFrame 的音频 采样率 , 采样位数 , 声道数 ( 左声道 / 右声道 / 立体声 ) 都是不确定的 , 但是在 Android 中的播放器 , 需要播放指定的 采样率 , 采样位数 , 声道数 参数的音频 , 因此需要将 AVFrame 中的音频数据 , 进行重采样 , 将其转换为我们创建的 Android 播放器可以播放的音频数据 ;


    3 . 参考视频解码 : 视频播放的时候也是从 AVStream 中读取 AVPacket 数据 , 然后解码为 AVFrame 数据 , 但是其图像大部分是 YUV 像素格式的 , 需要转成 ARGB 像素格式才能再 Android 的 SurfaceView 中进行绘制 ;


    4 . 重采样 与 像素格式转换 : 这个 音频重采样 与 图像的像素格式转换作用相同 , 都是将读取的不确定的音频图像格式 , 转成可以在 Android 中播放或显示的固定的音频图像格式 ;


    5 . OpenSL ES 播放参数举例 : 我们设置的 OpenSLES 播放器设定播放的音频格式是 立体声 , 44100 Hz 采样 , 16位采样位数 , 要将 AVFrame 中的解码后的音频转为上面的格式要求 , 才能再 OpenSLES 播放器中播放 ;



    IV . FFMPEG 初始化音频重采样上下文 SwrContext



    1 . 初始化音频重采样上下文 : 音频重采样需要先初始化 音频重采样上下文 SwrContext , 首先要调用 swr_alloc_set_opts ( ) 初始化内存 并 设置 SwrContext 参数 , 再调用 swr_init(swrContext) 方法初始化 ;


    2 . swr_alloc_set_opts ( ) 函数原型 : 为 SwrContext 音频重采样上下文 结构体分配内存 , 并设置相关参数 ;


    ① struct SwrContext *s 参数 : 音频重采样上下文 结构体指针 , 这里还没有 , 传入 0 即可 ;


    输出相关参数 :

    ② int64_t out_ch_layout 参数 : 输出通道参数 , 左声道 / 右声道 / 立体声 ;

    ③ enum AVSampleFormat out_sample_fmt 参数 : 输出采样位数 , 每个样本的大小 , 8 位 或 16 位 ;

    ④ int out_sample_rate 参数 : 输出的采样率 , 单位 Hz , 如 44100 Hz , 代表一秒钟有 44100 个采样 ;


    输入相关参数 :

    ⑤ int64_t in_ch_layout 参数 : 输入通道参数 , 左声道 / 右声道 / 立体声 ;

    ⑥ enum AVSampleFormat in_sample_fmt 参数 : 输入采样位数 , 每个样本的大小 , 8 位 或 16 位 ;

    ⑦ int in_sample_rate 参数 : 输入的采样率 , 单位 Hz , 如 44100 Hz , 代表一秒钟有 44100 个采样 ;


    ⑧ int log_offset 参数 : 日志相关参数 ; 0 即可 ;

    ⑨ void *log_ctx 参数 : 日志相关参数 ; 0 即可 ;

    /**
     * Allocate SwrContext if needed and set/reset common parameters.
     *
     * This function does not require s to be allocated with swr_alloc(). On the
     * other hand, swr_alloc() can use swr_alloc_set_opts() to set the parameters
     * on the allocated context.
     *
     * @param s               existing Swr context if available, or NULL if not
     * @param out_ch_layout   output channel layout (AV_CH_LAYOUT_*)
     * @param out_sample_fmt  output sample format (AV_SAMPLE_FMT_*).
     * @param out_sample_rate output sample rate (frequency in Hz)
     * @param in_ch_layout    input channel layout (AV_CH_LAYOUT_*)
     * @param in_sample_fmt   input sample format (AV_SAMPLE_FMT_*).
     * @param in_sample_rate  input sample rate (frequency in Hz)
     * @param log_offset      logging level offset
     * @param log_ctx         parent logging context, can be NULL
     *
     * @see swr_init(), swr_free()
     * @return NULL on error, allocated context otherwise
     */
    struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
                                          int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
                                          int64_t  in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
                                          int log_offset, void *log_ctx);
    

    3 . swr_init ( ) 函数原型 : 在用户设置完音频重采样上下文参数后 , 调用该方法可以初始化该上下文 ;


    ① int 返回值 : 如果初始化失败 , 会返回 AVERROR 错误码 ;

    /**
     * Initialize context after user parameters have been set.
     * @note The context must be configured using the AVOption API.
     *
     * @see av_opt_set_int()
     * @see av_opt_set_dict()
     *
     * @param[in,out]   s Swr context to initialize
     * @return AVERROR error code in case of failure.
     */
    int swr_init(struct SwrContext *s);
    

    4 . FFMPEG 初始化音频重采样上下文 SwrContext 代码示例 :

    /*
     设置音频重采样的上下文参数
     struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
        int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
        int64_t  in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
        int log_offset, void *log_ctx);
     */
    swrContext = swr_alloc_set_opts(
            0 ,                     //现在还没有 SwrContext 上下文 , 先传入 0
            //输出的音频参数
            AV_CH_LAYOUT_STEREO ,   //双声道立体声
            AV_SAMPLE_FMT_S16 ,     //采样位数 16 位
            44100 ,                 //输出的采样率
            //从编码器中获取输入音频格式
            avCodecContext->channel_layout, //输入的声道数
            avCodecContext->sample_fmt,     //输入的采样位数
            avCodecContext->sample_rate,    //输入的采样率
            0, 0    //日志参数 设置 0 即可
            );
    //注意创建完之后初始化
    swr_init(swrContext);
    


    V . FFMPEG 计算音频延迟样本数



    1 . 音频延迟情况 : FFMPEG 转码的过程中 , 可能没有一次性将一帧数据处理完毕 , 如输入了 20 个数据 , 一般情况下 20 个数据都能处理完毕 , 有时还会出现只处理了 19 个 , 剩余的 1 个数据就积压在了缓冲区中的情况 , 如果这种积压在缓冲区中的数据过大 , 会造成很大的音频延迟 , 甚至内存崩溃 ;


    2 . 延迟数据处理方案 : 每次音频处理时 , 都尝试将上一次积压的音频采样数据加入到本次处理的数据中 , 防止出现音频延迟的情况 ;


    3 . 获取音频数据积压个数 : 调用 swr_get_delay ( ) 方法 , 可以获取当前积压的音频采样数 , 或播放延迟时间 ;


    4 . 对延迟的理解 : swr_get_delay ( ) 获取的是下一次的样本数据 A 输入 经过多长时间延迟后 , 才能将样本 A 播放出来 , 这个延迟就是积压的数据的播放时间 , 因此每次处理时将少部分积压数据进行处理 , 可以有效降低音频延迟 ;


    5 . swr_get_delay ( ) 函数原型 : 获取下一次输入的样本 , 到对应的样本输出时 , 需要经历的延迟 , 即获取延迟的数据播放时长或样本个数 ( 二选一 ) ;


    ① struct SwrContext *s 参数 : 音频重采样上下文 结构体指针 ;

    ② int64_t base 参数 : 设置成 1 / 1000 获取延迟的时间 秒 / 毫秒 , 设置采样率 获取延迟的样本个数 ;

    /**
     * Gets the delay the next input sample will experience relative to the next output sample.
     *
     * Swresample can buffer data if more input has been provided than available
     * output space, also converting between sample rates needs a delay.
     * This function returns the sum of all such delays.
     * The exact delay is not necessarily an integer value in either input or
     * output sample rate. Especially when downsampling by a large value, the
     * output sample rate may be a poor choice to represent the delay, similarly
     * for upsampling and the input sample rate.
     *
     * @param s     swr context
     * @param base  timebase in which the returned delay will be:
     *              @li if it's set to 1 the returned delay is in seconds
     *              @li if it's set to 1000 the returned delay is in milliseconds
     *              @li if it's set to the input sample rate then the returned
     *                  delay is in input samples
     *              @li if it's set to the output sample rate then the returned
     *                  delay is in output samples
     *              @li if it's the least common multiple of in_sample_rate and
     *                  out_sample_rate then an exact rounding-free delay will be
     *                  returned
     * @returns     the delay in 1 / @c base units.
     */
    int64_t swr_get_delay(struct SwrContext *s, int64_t base);
    

    6 . FFMPEG 计算音频延迟样本数 swr_get_delay ( ) 函数使用示例 : 这里传入样本采样率 , 获取的是样本个数 ;

    //OpenSLES 播放器设定播放的音频格式是 立体声 , 44100 Hz 采样 , 16位采样位数
    //  解码出来的 AVFrame 中的数据格式不确定 , 需要进行重采样
    /*
        int64_t swr_get_delay(
        struct SwrContext *s,
        int64_t base
        );
        转码的过程中 , 输入 10 个数据 , 并不一定都能处理完毕并输出 10 个数据 , 可能处理输出了 8 个数据
        还剩余 2 个数据没有处理
        那么在下一次处理的时候 , 需要将上次没有处理完的两个数据处理了 ;
        如果不处理上次的2个数据 , 那么数据会一直积压 , 如果积压数据过多 , 最终造成很大的延迟 , 甚至崩溃
        因此每次处理的时候 , 都要尝试将上次剩余没有处理的数据加入到本次处理的数据中
        如果计算出的 delay 一直等于 0 , 说明没有积压数据
     */
    int64_t delay = swr_get_delay(swrContext , avFrame->sample_rate);
    


    VI . FFMPEG 计算音频重采样输出样本个数



    1 . FFMPEG 音频重采样 : 音频重采样操作 , 需要指定一个输出样本个数, 目前已知的是 输入音频采样个数 , 输出音频采样率 , 输入音频采样率 , 需要计算出输出的音频采样个数 ;


    2 . 计算公式如下 :

    =音频播放时间 = \frac{输入音频采样个数}{输入音频采样率}


    =×输出音频采样个数= 音频播放时间 \times 输出音频采样率


    =×输出音频采样个数= \frac{输入音频采样个数}{输入音频采样率} \times 输出音频采样率


    3 . 计算溢出问题 : 上面涉及到的计算数据过大 , 音频采样率 与 采样个数 相乘 , 如 44100 Hz 采样率 , 10 万采样 , 相乘结果为 4,410,000,000 , 这个数量级有溢出的风险 , 为了解决计算溢出问题 , FFMPEG 给出了专门的函数 av_rescale_rnd ( ) 来处理这个计算 ;


    4 . av_rescale_rnd ( ) 函数原型 : 该函数传入上述 输入音频采样个数 , 输入音频采样率 , 输出音频采样率 参数 , 进行上述计算 , 没有溢出问题 ; 计算公式是 a * b / c ;


    ① int64_t a 参数 : 输入音频采样个数 ;

    ② int64_t b 参数 : 输出音频采样率 ;

    ③ int64_t c 参数 : 输入音频采样率 ;

    ④ enum AVRounding rnd 参数 : 小数转为整数的方式 , 如四舍五入 , 向上取整 , 或向下取整 等 ;

    /**
     * Rescale a 64-bit integer with specified rounding.
     *
     * The operation is mathematically equivalent to `a * b / c`, but writing that
     * directly can overflow, and does not support different rounding methods.
     *
     * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd()
     */
    int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;
    

    5 . FFMPEG 计算音频重采样输出缓冲区大小 代码示例 :

    /*
        将 a 个数据 , 由 c 采样率转换成 b 采样率后 , 返回多少数据
        int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;
        下面的方法时将 avFrame->nb_samples 个数据 , 由 avFrame->sample_rate 采样率转为 44100 采样率
        返回的数据个数
        AV_ROUND_UP : 向上取整
     */
    int64_t out_count = av_rescale_rnd(
            avFrame->nb_samples + delay, //本次要处理的数据个数
            44100,
            avFrame->sample_rate ,
            AV_ROUND_UP );
    


    VII . FFMPEG 输出样本缓冲区初始化



    音频重采样后 , 需要初始化一段内存 , 用于保存重采样后的样本数据 ; 为其分配内存 , 并初始化内存数据 ;

    /**
     * 存放重采样后的数据缓冲区 , 这个缓冲区存储 1 秒的数据 
     * 44100 Hz 采样率 , 16 位采样位数 , 双声道立体声 , 占用内存 44100 * 2 * 2 字节 
     */
    uint8_t *data = static_cast<uint8_t *>(malloc(44100 * 2 * 2)); 
    
    //初始化内存数据
    memset(data, 0, 44100 * 2 * 2);
    


    VIII . FFMPEG 音频重采样



    1 . 音频重采样 : 上面准备好了音频重采样的所有参数 , 音频重采样上下文 SwrContext , 输出样本个数 , 输出缓冲区 uint8_t *data , AVFrame 中封装了输入音频的数据内容 , 采样率 , 采样位数 等信息 , 调用 swr_convert ( ) 函数 , 传入上述参数 , 即可进行音频重采样 ;


    2 . swr_convert ( ) 函数原型 : FFMPEG 音频重采样的核心方法 ;


    ① struct SwrContext *s 参数 : 音频重采样上下文结构体指针 ;

    ② uint8_t **out 参数 : 输出的缓冲区 , 二维指针 ;

    ③ int out_count 参数 : 输出的缓冲区最大可接受的样本个数

    ④ const uint8_t **in 参数 : 输入的音频数据 ;

    ⑤ int in_count 参数 : 输入的样本个数

    ⑥ int 返回值 : 返回值是每个通道的样本个数 , 这里注意 , 如果是立体声 ,实际 样本数 是返回值 * 2 ;

    /** Convert audio.
     *
     * in and in_count can be set to 0 to flush the last few samples out at the
     * end.
     *
     * If more input is provided than output space, then the input will be buffered.
     * You can avoid this buffering by using swr_get_out_samples() to retrieve an
     * upper bound on the required number of output samples for the given number of
     * input samples. Conversion will run directly without copying whenever possible.
     *
     * @param s         allocated Swr context, with parameters set
     * @param out       output buffers, only the first one need be set in case of packed audio
     * @param out_count amount of space available for output in samples per channel
     * @param in        input buffers, only the first one need to be set in case of packed audio
     * @param in_count  number of input samples available in one channel
     *
     * @return number of samples output per channel, negative value on error
     */
    int swr_convert(struct SwrContext *s, uint8_t **out, int out_count,
                                    const uint8_t **in , int in_count);
    
    //参数注释
    int swr_convert(
           struct SwrContext *s,   //上下文
           uint8_t **out,          //输出的缓冲区 ( 需要计算 )
           int out_count,          //输出的缓冲区最大可接受的样本个数 ( 需要计算 )
           const uint8_t **in ,    //输入的数据
           int in_count);          //输入的数据大小
    

    3 . FFMPEG 音频重采样 swr_convert ( ) 函数 代码示例 :

    /*
     int swr_convert(
            struct SwrContext *s,   //上下文
            uint8_t **out,          //输出的缓冲区 ( 需要计算 )
            int out_count,          //输出的缓冲区最大可接受的样本个数 ( 需要计算 )
            const uint8_t **in ,    //输入的数据
            int in_count);          //输入的样本个数
    返回值 : 转换后的采样个数 , 是样本个数 , 每个样本是 16 位 , 两个字节 ;
            samples_out_count 是每个通道的样本数 , samples_out_count * 2 是立体声双声道样本个数
            samples_out_count * 2 * 2 是字节个数
     */
    int samples_per_channel_count = swr_convert(
            swrContext ,
            &data,
            out_count ,
            (const uint8_t **)avFrame->data, //普通指针转为 const 指针需要使用 const_cast 转换
            avFrame->nb_samples
            );
    


    IX . FFMPEG 音频重采样输出的重采样数据字节数计算



    1 . 初始值 : 上述调用 swr_convert ( ) 方法 , 进行音频重采样 , 返回值 samples_per_channel_count 是每个通道的样本个数 ;


    2 . 立体声样本数 : 如果该音频是立体声音频数据 , 其样本个数是 samples_per_channel_count * 2 ;


    3 . 16 位立体声样本个数 : 如果该音频是 16 位立体声数据 , 其数据字节大小是 samples_per_channel_count * 2 * 2 字节 ;


    4 . 计算字节数代码示例 :

    //根据样本个数计算样本的字节数
    pcm_data_bit_size = samples_per_channel_count * 2 * 2;
    


    X . FFMPEG 音频重采样部分代码总结



    // I . 音频重采样输出缓冲区准备
    
    
    /**
     * 存放重采样后的数据缓冲区 , 这个缓冲区存储 1 秒的数据 
     * 44100 Hz 采样率 , 16 位采样位数 , 双声道立体声 , 占用内存 44100 * 2 * 2 字节 
     */
    uint8_t *data = static_cast<uint8_t *>(malloc(44100 * 2 * 2)); 
    
    //初始化内存数据
    memset(data, 0, 44100 * 2 * 2);
    
    
    // II . 音频重采样上下文 初始化
    
    
    /*
     设置音频重采样的上下文参数
     struct SwrContext *swr_alloc_set_opts(struct SwrContext *s,
        int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
        int64_t  in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,
        int log_offset, void *log_ctx);
     */
    swrContext = swr_alloc_set_opts(
            0 ,                     //现在还没有 SwrContext 上下文 , 先传入 0
            //输出的音频参数
            AV_CH_LAYOUT_STEREO ,   //双声道立体声
            AV_SAMPLE_FMT_S16 ,     //采样位数 16 位
            44100 ,                 //输出的采样率
            //从编码器中获取输入音频格式
            avCodecContext->channel_layout, //输入的声道数
            avCodecContext->sample_fmt,     //输入的采样位数
            avCodecContext->sample_rate,    //输入的采样率
            0, 0    //日志参数 设置 0 即可
            );
            
    //注意创建完之后初始化
    swr_init(swrContext);
    
    
    // III . 获取延迟数据
    
    
    //OpenSLES 播放器设定播放的音频格式是 立体声 , 44100 Hz 采样 , 16位采样位数
    //  解码出来的 AVFrame 中的数据格式不确定 , 需要进行重采样
    /*
        int64_t swr_get_delay(
        struct SwrContext *s,
        int64_t base
        );
        转码的过程中 , 输入 10 个数据 , 并不一定都能处理完毕并输出 10 个数据 , 可能处理输出了 8 个数据
        还剩余 2 个数据没有处理
        那么在下一次处理的时候 , 需要将上次没有处理完的两个数据处理了 ;
        如果不处理上次的2个数据 , 那么数据会一直积压 , 如果积压数据过多 , 最终造成很大的延迟 , 甚至崩溃
        因此每次处理的时候 , 都要尝试将上次剩余没有处理的数据加入到本次处理的数据中
        如果计算出的 delay 一直等于 0 , 说明没有积压数据
     */
    int64_t delay = swr_get_delay(swrContext , avFrame->sample_rate);
    
    
    // IV . 计算输出样本个数
    
    
    /*
        将 a 个数据 , 由 c 采样率转换成 b 采样率后 , 返回多少数据
        int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;
        下面的方法时将 avFrame->nb_samples 个数据 , 由 avFrame->sample_rate 采样率转为 44100 采样率
        返回的数据个数
        AV_ROUND_UP : 向上取整
     */
    int64_t out_count = av_rescale_rnd(
            avFrame->nb_samples + delay, //本次要处理的数据个数
            44100,
            avFrame->sample_rate ,
            AV_ROUND_UP );
    
    
    // V . 音频重采样
    
    
    /*
     int swr_convert(
            struct SwrContext *s,   //上下文
            uint8_t **out,          //输出的缓冲区 ( 需要计算 )
            int out_count,          //输出的缓冲区最大可接受的样本个数 ( 需要计算 )
            const uint8_t **in ,    //输入的数据
            int in_count);          //输入的样本个数
    返回值 : 转换后的采样个数 , 是样本个数 , 每个样本是 16 位 , 两个字节 ;
            samples_out_count 是每个通道的样本数 , samples_out_count * 2 是立体声双声道样本个数
            samples_out_count * 2 * 2 是字节个数
     */
    int samples_per_channel_count = swr_convert(
            swrContext ,
            &data,
            out_count ,
            (const uint8_t **)avFrame->data, //普通指针转为 const 指针需要使用 const_cast 转换
            avFrame->nb_samples
            );
    
    
    // VI . 最终重采样后的数据字节大小
    
    
    //根据样本个数计算样本的字节数
    pcm_data_bit_size = samples_per_channel_count * 2 * 2;
    
    展开全文
  • 批量重采样

    2019-05-06 14:46:26
    批量重采样,ArcPy,第一次上传东西,没想到真麻烦
  • 光谱数据重采样

    2018-10-11 10:21:11
    matlab代码,用于高光谱、多光谱数据重采样,内容清晰
  • 遥感波谱重采样

    2015-11-20 20:01:33
    demo可直接运行,重采样函数实现了批量读取.xls格式波谱库,并对其进行指定波谱范围的重采样,有详细注释。
  • --提取、分割、融合、裁剪(矢)、合并、追加、镶嵌、裁剪(栅)、重采样 GIS思维 今天我们来聊聊ArcGIS中常用你又必须掌握的几个工具,如筛选、分割、融合、裁剪(矢量)、合并、追加、镶嵌、裁剪...

                             ArcGIS必会的几个工具的应用

       --提取、分割、融合、裁剪(矢)、合并、追加、镶嵌、裁剪(栅)、重采样

                                                   GIS思维


           今天我们来聊聊ArcGIS中常用你又必须掌握的几个工具,如筛选、分割、融合、裁剪(矢量)、合并、追加、镶嵌、裁剪(栅格)、重采样。

          本次文章我们会按矢量和栅格两部分来介绍几个工具。这个是ArcGIS的套路,也是大部分GIS类软件的套路,将矢量和栅格分开来。关于矢量和栅格的区别我们在GIS思维发布的《ArcGIS 10.X 入门实战视频教程(GIS思维)》介绍的较为清楚,我们不加以赘述。可查看我博客里面的文章。如下。

    https://blog.csdn.net/kinghxj/article/details/83575365

          本次文章的分享,也是我们《ArcGIS 10.X 入门实战视频教程(GIS思维)》的章节内容,所以要观看视频课程,获取文章分享的数据与课件可以报名参加我们的课程。下有链接。

    https://blog.csdn.net/kinghxj/article/details/83575365

    数据类别

    工具

    描述

               失    量

    筛选(Select)

    从输入要素类或输入要素图层中提取要素(通常使用选择或结构化查询语言 (SQL) 表达式),并将其存储于输出要素类中。

    分割(Split)

    分割输入要素会创建一个多个输出要素类的子集。
    “分割字段”的唯一值生成输出要素类的名称。它们保存在目标工作空间中。

    融合(dissolve)

    基于指定属性聚合要素

    裁剪矢量(clip)

    提取与裁剪要素相重叠的输入要素。
    此工具用于以其他要素类中的一个或多个要素作为模具来剪切掉要素类的一部分。

    合并(merge)

    将数据类型相同的多个输入数据集合并为新的单个输出数据集。此工具可以合并点、线或面要素类或表。

    追加(append)

    将多个输入数据集追加到现有目标数据集。输入数据集可以是点、线、面要素类、表、栅格、栅格目录、注记要素类或尺寸要素类。    

               栅    格

    镶嵌((Mosaic  and Mosaic To New Raster)

    将多个栅格数据集合并到一个新的栅格数据集中。(4个地理工具可用于此操作)

    裁剪栅格(clip)

    裁剪掉栅格数据集、镶嵌数据集或图像服务图层的一部分。

    按掩膜提取 (Extract By Mask)

    提取所定义掩膜区域内的栅格像元

    重采样(resample)

    更改栅格数据集的空间分辨率并针对所有新像素大小的聚合值或插值设置规则。

     

     

    1、筛选

    第一个工具,我们来看下比较简单的筛选工具的应用。筛选(select)的用法:从输入要素类或输入要素图层中提取要素(通常使用选择或结构化查询语言 (SQL) 表达式),并将其存储于输出要素类中。我们首先来看下案例数据-福建的各县行政区划矢量图。

     

                                                 图1-1                                                                  图1-2

    该数据属性表中,有NAME和city等字段,其中NAME代表区县名,city代表区县所在的地级市城市编码。例如,闽侯县归属福州市(3501),仙游县归属莆田市(3503)。那么,要筛选出福州下辖的所有区县,只要利用筛选工具选出city字段是3501的记录就可。

    • 打开筛选工具,分析工具à提取分析à筛选

                                                                

                                                                                    图1-3

    • 有如下图的参数设置,点击确定,就得到我们想要的结果。

                              

                                                                                    图1-4

    • 运行结果如下。具体操作,可以观看学习如上所述视频教程。

                                       

                                                                                                图1-5

    2、分割

            现在我们在裁剪中福建的各县行政区划矢量图fj基础上又有了福建省各地级市的行政区划图fj5(网络数据,仅供学习参考使用),如下图。那我们的问题来了,我们要如1中那样筛选出福建九个地级市(福州、厦门、莆田、泉州、漳州、龙岩、三明、南平、宁德)区县划数据,当然我们可以如1中操作9次得到我们的结果,但这样一来操作就麻烦了,万一你来个全国地级市,那不是坑爹,所以为了提高效率我们引入了分割(split)工具的应用。

                                 

                                                             图2-1福建省各地级市的行政区划图fj5

            先来瞧一瞧,分割工具的用法。分割输入要素会创建一个多个输出要素类的子集,原理如下图2-2。这样一想,是不是输入就是我们的福建各县区划图fj,分割要素就是福建的地级市区划图fj5。其中的区域1、区域2等就是指代了福州市、厦门是等。

                             

                                                                    图2-2 分割工具原理图

    • 实际操作开始。打开工具,分析工具à提取分析à分割

                                                            

                                                                             图2-3

    • 具体参数如下设置。点击确定,便可得到我们的结果

                       

                                                                                图2-4

    • 运行结果如下。具体操作、工具参数详解可以观看学习如上所述视频教程。

                                 

                                                                                图2-5

    • 思考:如果我们想将福建的各县行政区划矢量图fj分割成每个县一个矢量图层,用分割工具该怎么操作。答案可参考我们的视频教程

    3、融合

          现在假设我们只有福建的各县行政区划矢量图fj(如图1-1),想要在fj基础上经过处理得到福建省各地级市的行政区划图(如图2-1)。我们可能比较直观的想法,就是把各个地级市下辖的区县选择合并,当然是可以,但效率低下。这时候我们就要让融合工具(dissolve)出场了,它的作用就是基于指定属性聚合要素,如图3-1。图中绿色的各个小图斑具有共同的属性值A,黄色小图斑具有共同属性值B······,基于这个属性进行聚合,就得到了结果。

                       

                                                                           图3-1

                这时我们就联想到区县数据中fj中福州的各个区县city字段的属性值是3501,莆田的各个区县的city字段的属性值是3503······,这样一来我们就可以根据city字段对fj进行聚合了。

    • 打开融合工具,有两个途径。一是工具箱中,数据管理à制图综合à融合,而是在菜单栏选择地理处理à融合。

                            

                                                                图3-4

    • 如下图3-5设置相关参数,拓展参数部分可以参考视频教程。

                      

                                                                图3-5

    • 运行之后如图所示。

                                     

                                                                                 图3-6

    4、矢量裁剪

          现在,我们有一植被覆盖数据如图、有一个项目红线4-1,你只想要项目红线中的地表覆盖情况。自然而然就想到了ArcGIS当中的矢量数据裁剪。

                                 

                                                                                图4-1

            ArcGIS中矢量的裁剪指的就是提取与裁剪要素相重叠的输入要素,如图4-2。输入要素在裁剪范围中数据被提取出来。要注意输入要素、裁剪要素都可以是点、线、面要素。只是实际应用中我们经常只是碰到面要素作为裁剪要素罢了。等下我们贴两张图大家随意体会下。

                           

                                                                                图4-2

    裁剪是比较简单的了,下面我们就来操作一下吧。特别要注意,矢量裁剪和栅格裁剪不是一个工具哦,不要混淆。

    • 打开裁剪工具,分析工具à提取分析à裁剪。

                                                         

                                                                          图4-3

     

    •  打开工具如下设置,便可确定运行得到结果。

                             

                                                                图4-4 裁剪工具运行参数设置及运行结果

             裁剪是比较简单的,但是也有我们要注意的地方,有以下两点:1、注意裁剪要素有可能产生多部件要素,如图4-4中蓝色高亮显示,这种情况是由于输入要素的一个图斑分布在裁剪要素两个或两个以上分离开的图斑,多部件的要素后续可以使用多部件转单部件要素炸开,具体可以查看我们的视频教程,我们这里就不加赘述。2、如果你的输入要素有面积字段且裁剪之后的结果保存为shp非地理数据库要素,那么要注意输出的要素中面积字段的值是原来为裁剪图斑的面积,所以你需要重新计算面积,如果你保存在地理数据库中那么不需要,因为会自动重算ShpArea字段。具体也可以查看视频教程。

    下面,放两张图,大家体会了解一下,裁剪要素是点、线、面要素时候的情况。

                             

                                                                   图4-5                                                      

                                

                                                                              图4-6

    5、合并

          合并,是我们会经常碰到的。一个项目区大,一般都是分成几个子区来做,那后续就要把各个子区的数据合并起来。在ArcGIS的合并可能到大家会想到很多,比如编辑器当中的同一个图层内要素的合并、叠加分析中联合工具(Union)、复制粘贴达到的合并功能、以及我们今天要讲的这个合并工具。他们每一个的用法都是不一样的,当然碍于篇幅限制我们不一一展开,具体其他的工具应用可以参考我们的入门课程,今天这里我们就给大家介绍下数据管理工具下,常规工具集下的合并。合并,相同的多个输入数据集合并为新的单个输出数据集。

          如图5-1,我们要福建南部的区县划数据fj_S以及福建北部的区县划数据fj_N,我们就可以通过合并工具得到5-1的右边福建全省的区县划数据。

                                                                            图5-1

    接下来我们就用工具,给大家实际演示下吧。

    • 打开合并工具,数据管理工具à常规à合并,并进行如下的参数设置,可得5-1结果。字段的映射属于可选字段,我们的文章输入基础篇,我们就不加以展开,在视频中一并介绍。

                              

                                                                           图5-2

    6、追加

          追加,往广义一点上说其实也是一种合并,比较明显的区别就是追加将多个输入数据集追加到现有目标数据集,不会像合并工具一样产生一个新的数据集。如图6-1,将福建南部的区县划数据fj_S追加到福建北部的区县划数据fj_N,fj_N目标要素,6-1右边追加的结果是没有产生一个新的数据集的,而是原来fj_N。

                                  

     

                                                                    图6-1

    • 打开追加工具,数据管理工具à常规à追加,并进行如下的参数设置,可得6-1结果。方案类型参数的选择参考下面说明,字段的映射属于可选字段,我们的文章属于基础篇,我们就不加以展开,在视频中一并介绍。

                                     

                                                                           图6-2

    • 注意:方案类型中的参数为Test与No Test。

    方案类型 (可选) :指定输入数据集的方案(字段定义)是否必须与目标数据集的方案相匹配才能追加要素。

    • TEST—输入数据集的方案(字段定义)必须与目标数据集的方案相匹配。如果方案不匹配,将返回错误。 就是说字段要一致,字段不同、多或少都会报错,如图6-3。
    • NO_TEST—输入数据集的方案(字段定义)不必与目标数据集的方案相匹配。但是,如果输入数据集的字段与目标数据集的字段不匹配,将不会被映射到目标数据集,除非在“字段映射”控件中对映射进行了显式设置。

                            

                                                                              图6-3

     

    字段映射 (可选)

    控制如何将输入数据集字段中的属性信息传输到目标数据集。只有在指定方案类型 NO_TEST 的情况下,才能使用这个参数。

    由于输入数据集的数据被追加到具有预定义方案(字段定义)的现有目标数据集中,因此不允许在目标数据集中添加或移除字段。

    合并规则用于指定如何将两个或更多个输入字段的值合并或组合为一个输出值。有多种合并规则可用于确定如何用值填充输出字段。

    子类型 (可选)

    用于将子类型分配给已追加到目标数据集中的所有新数据的子类型描述。

     

    推荐学习

    ArcGIS10.X入门实战视频教程(GIS思维)

    ArcGIS之模型构建器(ModelBuilder)视频教程

    ArcGIS之遥感影像分类及成果应用视频课程

    ArcPy结合数据驱动模块的批量制图

    ArcGIS之Data Reviewer空间数据质量检查

    GIS思维GIS系列技术课程

     

    展开全文
  • UPF重采样算法

    2012-04-10 10:42:00
    Multinomial re-sampling 多项式重采样,Residual re-sampling 残差重采样,Stratified re-sampling 分层重采样,Systematic re-sampling 系统重采样 , regularized re- sampling 正则重采样算法
  • 音频重采样音频重采样音频重采样音频重采样音频重采样音频重采样
  • FFMPEG实现音频重采样

    2018-07-28 12:56:46
    FFMPEG实现音频重采样,示例代码实现将PCM的交叉存储方式转换成平行存储方式
  • 图像重采样

    千次阅读 2019-08-29 14:29:46
    图像重采样包含两种情形,一种是下采样(downsampling),把图像变小;另一种是上采样(upsampling),把图像变大。 1、次级采样(sub-sampling) 每隔一个,扔掉行和列,创建一个更小的图像。 2、下采样(down...

    图像重采样包含两种情形,一种是下采样(downsampling),把图像变小;另一种是上采样(upsampling),把图像变大。

    1、次级采样(sub-sampling)

    每隔一个,扔掉行和列,创建一个更小的图像。

    2、下采样(downsampling)

    根据Nyquist采样定律,采样频率大于等于2倍的图像的最大频率。

    对于高清图片,如果直接采样,采样频率很高。

    如果先对图像进行模糊化处理(高斯滤波),就可以降低采样频率了,

    最后进行次级采样(sub-sampling),就可以得到小一倍的图片了。

    总结:下采样=高斯滤波+次级采样

    3、高斯金字塔(Gaussian pyramids)

    在下采样过程中图,所有模糊化处理之前的图片构成一个高斯金字塔。最底层为原图。

    高斯金字塔实际上是图像的多尺度表示法。模仿人眼在近处看到的图像细致,对应金字塔底层;在远处看到图像较为模糊,但可以看到整个轮廓,对应金字塔顶层。

    4、上采样(upsampling)

    插值(interpolation):离散信号之间插入新的值。

    但实际情况,函数F[x]是未知的。

    图像的插值也可以通过构造函数与图像的卷积运算实现。插入的新值即为新的像素色度值。

    对于相同的离散信号,使用不同的构造函数,最后得到的结果也不一样。如下图所示,

    其它的构造滤波器

     

    图像的实际效果

     

    展开全文
  • 栅格重采样

    千次阅读 2014-11-14 21:55:19
    栅格重采样的实质: 栅格重采样是将输入图像的像元值或推导值赋予输出图像中每个像元的过程。 栅格重采样发生时机: 当输入图像和输出图像的位置(经过几何变换或投影设置等操作)或像元大小(即栅格影像...
  • 重采样与重分类

    千次阅读 2017-06-09 11:16:45
    经常会有同学将重采样和重分类混为一谈。实际上,这完全是不同的两个知识点。  重采样是指更改栅格数据集的空间分辨率并针对所有新像素大小的聚合值或插值设置规则,可以改变像元的大小,但栅格数据集的范围将保持...
  • 音频重采样

    2020-11-18 09:26:28
    音频重采样流程图 函数介绍 swr_alloc() 分配音频重采样的上下文 swr_alloc_set_opts(...) 设置音频重采样参数,可以通过音频的样本率来改变播放速度,但声音一般会失真 struct SwrContext *swr_...
  • gadl 基本用法 重采样 重投影函数 封装成动态链接库的形式
  • 什么是音频重采样

    2021-04-18 15:19:00
    是什么是重采样 将音频三元组(采样率,采样大小和通道数)的值转成另外一组值 三元组其中任意一个值发生改变就称为重采样, 例如44100/16/2 转成 48000/16/2 为什么要重采样 从设备采集的音频数据与编码器要求的...
  • C编写的重采样代码

    2014-12-18 15:16:18
    本程序是编写的C实现的重采样代码,可以实现信号的重采样。并且可以提取出重采样的算法
  • resample 重采样

    2021-02-26 17:21:48
    resample采样 统称:重采样 重采样是按照频率划分:降采样 和 升采样 #降采集 import pandas as pd data_index = pd.data_range('20190701',periods=12) DataSeries = pd.Series(index=data_index,data=np.arange...
  • 音频重采样Demo(Speex)

    2020-10-12 18:04:33
    此文件为c++代码,使用Speex对音频进行重采样,demo中做了48kHz到44.1kHz的转换。
  • 粒子滤波重采样

    千次阅读 2019-06-24 08:44:39
    重采样主要是为了解决经典蒙特卡洛方法中出现的粒子匮乏现象。其主要思想是对粒子和其相应的权值表示的概率密度函数重新进行采样。通过增加权值较大粒子和减少权值较小粒子来实现。重采样虽然可以改善粒子匮乏现象,...
  • 重采样 和 重分类

    2019-09-24 16:00:01
    重采样是指更改栅格数据集的空间分辨率并针对所有新像素大小的聚合值或插值设置规则,可以改变像元的大小,但栅格数据集的范围将保持不变。重采样之后栅格数据的每个像元将具有唯一属性值。重采样的效果是像素的灰度...
  • xilinx的音频重采样模块Verilog源码,可以实现任意采样率的转换,供大家学习。
  • ffmepg音频重采样DEMO

    2016-08-02 18:52:31
    在进行音频播放时,有时视频流不能满足播放要求,需要对声音的相关属性如:通道数,采样率,样本存储方式进行变更播放,也就是音频重采样。ffmpeg提供了SwrContext进行转换。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,749
精华内容 23,899
关键字:

重采样