请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

为什么我运行的时候 输出缓冲区linesize 会比swr_convert返回值(实际转换样本数)大一些,导致直接往文件中写linesize个字节会出现哒哒声?

请问输出缓冲区的大小dst_linesize是会自动扩充几个字节吗?

// 重采样的返回值为实际转换样本数
        real_convert_samples = swr_convert(swr_ctx,                    // 重采样上下文
                                           dst_data,                   // 重采样输出缓冲区
                                           out_nb_samples,             // 输出单通道最大采样数,可以设置大一些
                                           (const uint8_t **)src_data, // 重采样输入缓冲区
                                           22050);                     // 输入单通道采样数

        av_log(NULL, AV_LOG_INFO, "real convert samples = %d,dst_linesize=%d\n",
               real_convert_samples, dst_linesize);

运行时打印为

[dshow @ 000001958b1f50c0] passing through packet of type audio size    88200 timestamp 544073420000 orig timestamp 544073420000 graph timestamp 544078420000 diff 5000000 麦克风阵列 (Realtek(R) Audio)
packet size is 88200(000001958ca4f580),count = 20
real convert samples = 22050,dst_linesize=176640

正在回答 回答被采纳积分+3

1回答

李超 2022-12-10 20:55:34

你dst_linesize 从哪儿获的?

0 回复 有任何疑惑可以回复我~
  • 提问者 TRknight #1
    就是输出缓冲区的大小,应该和视频中一样,av_samples_alloc_array_and_samples的第二个参数用地址传出的,其他地方没有赋值
    
    int out_nb_samples = 22050;
        // 创建输入缓冲区
        av_samples_alloc_array_and_samples(&src_data,         // 输入缓冲区地址
                                           &src_linesize,     // 缓冲区大小
                                           2,                 // 通道数
                                           22050,             // 每帧数据的单通道采样数 88400/2/2
                                           AV_SAMPLE_FMT_S16, // 采样格式
                                           0);
    
        // 创建输出缓冲区
        av_samples_alloc_array_and_samples(&dst_data,         // 输出缓冲区地址
                                           &dst_linesize,     // 缓冲区大小
                                           2,                 // 通道数
                                           out_nb_samples,    // 每帧数据的单通道采样数
                                           AV_SAMPLE_FMT_S32, // 采样格式
                                           0);
    回复 有任何疑惑可以回复我~ 2022-12-10 22:17:00
  • 李超 #2
    那个是函数算出来的,他会根据你传入的参数自己计算
    回复 有任何疑惑可以回复我~ 2022-12-11 08:21:20
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信