http://hi.baidu.com/mingyuejingque/item/78e71aff57ae9ec5a835a2e4

感谢mingyuejingque

st = avformat_new_stream( m_oc, NULL);

if (!st) {

fprintf(stderr, "Could not allocate stream\n");

exit(1);

}

st->id = m_oc->nb_streams-1;

AVCodecContext *c = st->codec;

c->codec_type = in_stream->codec->codec_type;

/* Some formats want stream headers to be separate. */

if (m_oc->oformat->flags & AVFMT_GLOBALHEADER)

c->flags |= CODEC_FLAG_GLOBAL_HEADER;

switch ((codec)->type) {

case AVMEDIA_TYPE_AUDIO:

c->sample_fmt = FORCE_smaple_fmt;

//       c->bit_rate = FORCE_BIT_RATE;

c->sample_rate = FORCE_sample_rate;

c->codec_id = FORCE_CODEC_AUDIO;

c->channels = in_stream->codec->channels;

c->channel_layout   = in_stream->codec->channel_layout;

c->time_base = in_stream->codec->time_base;

// c->profile = FORCE_profile;

m_AudioStream = st;

/* open it */

ret = avcodec_open2(c, codec, NULL);

if (ret < 0) {

printf("Could not open audio codec");

exit(1);

}

m_Codec = codec;

m_CodecContext = c; //这是音频编码的,视频没做编码。

break;

}

/* Some formats want stream headers to be separate. */

if (m_oc->oformat->flags & AVFMT_GLOBALHEADER)

c->flags |= CODEC_FLAG_GLOBAL_HEADER;

叼,这样写的代码有个潜规则,那就是:

if (av_buffersrc_add_frame_flags(m_filter_in_param.buffersrc_ctx, in_frame, 0) < 0) {

av_log(NULL, AV_LOG_ERROR, "Error while feeding the audio filtergraph\n");

goto quit;

}

while (1) {

ret = av_buffersink_get_frame(m_filter_in_param.buffersink_ctx, filt_frame);

if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)

{

ret = -1;

goto quit;

}

if(ret < 0)

goto quit;

ret = avcodec_encode_audio2(m_CodecContext, new_packet, filt_frame, &got_frame);

av_frame_free( &filt_frame );

if ( got_frame )

goto quit;

}

从这里编码出来的packet,让ffmpeg写到文件里去的时候会报错:

[mp4 @ 0119ad00] Malformed AAC bitstream detected: use audio bitstream filter

'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)

小孩子要什么filter来修正啊,叼,试了大半天也不知道哪个合适,并且也不想随便就加filter下去,万一它消耗太多cpu怎么办。

又是看ffmpeg的源码,avcodec_open2  看到返回0是正常的,内部调用了c->codec_init() 我也看到aacenc.c里去了,用反证法:它里面要是说参数又问题,肯定会返回负值,既然返回0就说明它是正常执行的。

AVCodec *codec = avcodec_find_encoder( codecid ); //这个没什么好说,下面又没对codec做什么改变。

下面的AVCodecContext *c = st->codec;你就诡异了,

/* open it */

ret = avcodec_open2(c, codec, NULL);

if (ret < 0) {

printf("Could not open audio codec");

exit(1);

}

严重怀疑c,c就是stream->codec,这个stream是在AVFormatContext *m_oc里的流。 跟到ffmpeg源码里去,发现是:

c->flags |= CODEC_FLAG_GLOBAL_HEADER;   这个标志位没设置,叼,一般这个都是写在函数末尾,这里先提前了,放到avcodec_open2前面去,这肯定是我粗心大意?

/* Some formats want stream headers to be separate. */

if (m_oc->oformat->flags & AVFMT_GLOBALHEADER)

c->flags |= CODEC_FLAG_GLOBAL_HEADER;

avcodec_open2( c, codec, NULL ); 哟西,没事了。假装没事发生。。。。。。。。

从ffmpeg filter里出来的数据直接送给avcodec_encode_audio2编码,写文件有错。的更多相关文章

  1. 【大数据系列】hadoop上传文件报错_COPYING_ could only be replicated to 0 nodes

    使用hadoop上传文件 hdfs dfs -put  XXX 17/12/08 17:00:39 WARN hdfs.DFSClient: DataStreamer Exception org.ap ...

  2. vue 监听对象里的特定数据

    vue  监听对象里的特定数据变化 通常是这样写的,只能监听某一个特定数据 watch: { params: function(val) { console.log(val) this.$ajax.g ...

  3. (三) ffmpeg filter学习-编写自己的filter

    目录 目录 什么是ffmpeg filter 如何使用ffmpeg filter 1 将输入的1920x1080缩小到960x540输出 2 为视频添加logo 3 去掉视频的logo 自己写一个过滤 ...

  4. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  5. FFmpeg filter简介

    [时间:2016-08] [状态:Open] [关键词:FFmpeg, filter, filter graph,命令行] 1. 引言及示例 FFmpeg中的libavfilter提供了一整套的基于f ...

  6. ffmpeg 从内存中读取数据(或将数据输出到内存)(转)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  7. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  8. ffmpeg从AVFrame取出yuv数据到保存到char*中

    ffmpeg从AVFrame取出yuv数据到保存到char*中   很多人一直不知道怎么利用ffmpeg从AVFrame取出yuv数据到保存到char*中,下面代码将yuv420p和yuv422p的数 ...

  9. 在SSMS里查看TDS数据包内容

    原文:在SSMS里查看TDS数据包内容 在SSMS里查看TDS数据包内容 摘抄自<SQLSERVER2012实施与管理实战指南> 要具体查看TDS数据库的内容,我们可以: 用NETWORK ...

随机推荐

  1. oracle 树查询

    select LPAD('-----',t.menu_level)||t.obj_id,t.*,rowid from imes10dba.tb_adm_menu t start with t.pare ...

  2. Java中泛型的Class<Object>与Class<?>的区别(转)

    Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以. List<Object>可以放任何类对象. List<? extends ...

  3. interesting-exploit

    http://whereisk0shl.top/cve-2017-7269-iis6-interesting-exploit.html

  4. GOF 23种设计摩搜-建造者模式

    • 场景: – 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样 一个问题需要处理: • 装配这些子组件是不是有个步骤问题? – 实际开发中,我们所需要的对象构建时 ...

  5. Understand the Business Domain

     Understand the Business Domain Mark Richards EFFECTivE SoFTWARE ARCHiTECTS understand not only tec ...

  6. Android GC 原理探究

    导语 想写一篇关于 android GC 的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的 GC 导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和 GC 的原理,为 ...

  7. ann搜索算法(Approximate Nearest Neighbor)

    ANN的方法分为三大类:基于树的方法.哈希方法.矢量量化方法.brute-force搜索的方式是在全空间进行搜索,为了加快查找的速度,几乎所有的ANN方法都是通过对全空间分割,将其分割成很多小的子空间 ...

  8. 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)

    http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...

  9. IntelliJ IDEA 10.5.1 引用外部Jar包

    具体步骤: File -> Project Structure (ctrl + shift + alt + s ) -> Module -> Dependencies -> A ...

  10. Solidworks安装完成提示failed to load slderresu.dll怎么办

    安装完成出现下面的一系列错误提示   进入到语言包,重新安装中文语言包即可   可以正常打开和运行了