FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案

在实际的项目中,从音频设备采集到的音频的类型和编码器类型(aac ,amr)通常是不一致的。

那么我们首先需要做重采样的过程。利用swr_convert 重新采样。

这时候我们可能会遇到另外一个问题。就是在encode_audio的时候遇到

more samples than frame size (avcodec_encode_audio2)  的问题。

问题的原因在于 我们编码器的frame_size 比采集到的fram->nb_samples小

[cpp] view plaincopy

  1. /* check for valid frame size */

  2. if (frame) {

  3. if (avctx->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {

  4. if (frame->nb_samples > avctx->frame_size) {

  5. av_log(avctx, AV_LOG_ERROR, "more samples than frame size (avcodec_encode_audio2)\n");

  6. return AVERROR(EINVAL);

  7. }

  8. } else if (!(avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {

  9. if (frame->nb_samples < avctx->frame_size &&

  10. !avctx->internal->last_audio_frame) {

  11. ret = pad_last_frame(avctx, &padded_frame, frame);

  12. if (ret < 0)

  13. return ret;
  14. frame = padded_frame;

  15. avctx->internal->last_audio_frame = 1;

  16. }
  17. if (frame->nb_samples != avctx->frame_size) {

  18. av_log(avctx, AV_LOG_ERROR, "nb_samples (%d) != frame_size (%d) (avcodec_encode_audio2)\n", frame->nb_samples, avctx->frame_size);

  19. ret = AVERROR(EINVAL);

  20. goto end;

  21. }

  22. }

  23. }

解决的方案是:每次采集到的frame数据保存到一个AUDIO
FIFO中,每次等凑齐刚好frame_size大小的数据(请注意这里是刚好,网上有人说拆分AVframe,本人在ffmpeg2.1用这个办法没办法解决),接着把这些数据一口气encode。

如果有剩余的数据就存储到下一次encode。可以使用audio_fifo_来操作数据

http://www.ffmpeg.org/doxygen/1.0/audio__fifo_8c-source.html

http://blog.csdn.net/zsc09_leaf/article/details/16858193

参考transcode_aac.c即可

FFMPEG more samples than frame size (avcodec_encode_audio2)
的解决方案,布布扣,bubuko.com

FFMPEG more samples than frame size (avcodec_encode_audio2)
的解决方案

时间: 2024-10-10 05:55:54

FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案的相关文章

self.view.frame.size.height = 100f; 这样写没法通过编译,编译器会报错&quot;expression is not assignable&quot;

self.view.frame.size.height = 100f; 这样写没法通过编译,编译器会报错"expression is not assignable" 原因是,这句话里面的几个点有两种不同的含义.self.view.frame是Objective-C语法,是读取view属性的frame属性,在Objective-C中使用点来访问属性只是一种语法糖,所以self.view.frame这句话会被转换成: [[self view] frame] 也就是说,实际上这是消息传递.

OC中 self.view.frame.size.height = 100; 不能通过编译的原因

在OC中,当需要修改一个view的尺寸时,通常是通过先将 self.view.fram赋值给一个临时变量,然后修改临时变量,最后将临时变量赋值给 self.view.frame.代码如下: 1 // 1. 用一个临时变量保存返回值. 2 CGRect temp = self.view.frame; 3 4 // 2. 给这个变量赋值.因为变量都是L-Value,可以被赋值 5 temp.size.height = 100f; 6 7 // 3. 修改frame的值 8 self.view.fra

FFmpeg--如何同步音视频的解决方案

如何同步视频 PTS和DTS 幸运的是,音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面.音频流有采样,视频流有每秒的帧率.然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步.于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制.为了这两个参数,你需要了解电影存放的方式.像MPEG等格式,使用被叫做B帧(B表示双向bidrectional)的方式.另外两种帧被叫做I帧和P帧(I表示关键帧,P表示预测帧).I帧包含

十三:UIView中frame的封装(方便使用x,y,width,height,center,size等)

新建一个继承自UIView的扩展类 在.h文件中写代码: 1 @property (assign, nonatomic)CGSize size; 2 @property (assign, nonatomic)CGFloat width; 3 @property (assign, nonatomic)CGFloat height; 4 @property (assign, nonatomic)CGFloat x; 5 @property (assign, nonatomic)CGFloat y;

FFmpeg API 变更记录

最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例如一年前的程序中,获取媒体信息使用的函数是av_find_stream_info().但是最近的版本中,av_find_stream_info()函数已经无法使用了,取而代之的是avformat_find_stream_info().再比如,早一些的程序中,打开解码器可以使用avcodec_open

基于ffmpeg的简单音视频编解码的例子

近日需要做一个视频转码服务器,对我这样一个在该领域的新手来说却是够我折腾一番,在别人的建议下开始研究开源ffmpeg项目,下面是在代码中看到的一 段例子代码,对我的学习非常有帮助.该例子代码包含音频的解码/编码和视频的编码/解码,其中主要用到编解码的libavcodec组件.以下是完整的例 子,代码自身的注释足够清晰了./**  * @file  * libavcodec API use example.  *  * Note that libavcodec only handles codec

FFmpeg学习3:播放音频

参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出.本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播放音频 数据队列 音频格式的转换 dranger tutorial确实入门FFmpeg比较好的教程,虽然作者在2015年的时候根据新版本的FFmpeg更新了,但是其中还是有不少API过时了.特别是,教程中使用的是SDL1.0,和现在的SDL2的API也有很大的不同,并且不能兼容. 1. 关于音频的一些

ffmpeg实现录屏+录音

1.概述 最简单的基于FFmpeg的AVDevice例子(屏幕录制+声音采集),视频采用mpeg4编码,音频采用aac编码,并生成mp4文件,其中fifo是此程序的关键,此程序只是一个demo很多优化都没做,仅供参考. 2.代码 /** *最简单的基于FFmpeg的AVDevice例子(屏幕录制+声音采集),视频采用mpeg4编码,音频采用aac编码,并生成mp4文件 *缪国凯 MK *[email protected] */ #include "stdafx.h" #ifdef __

ffmpeg最全的命令参数

Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Getting help: -h -- print basic options -h long -- print more options -h full -- print all options (including all format and code