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. 板子-GOD BLESS ALL OF YOU

    字符串: KMP #include<cstdio> #include<cstring> ; ]; ]; int l1,l2; void get_next() { next[]= ...

  2. Linux下查看某个命令的参数

    1.一般每个命令都带有help参数,使用方法如下: shutdown --help 提示:shutdown为关机命令,在真实环境使用时需要root权限,比如前面加sudo. 2.使用man命令查看,使 ...

  3. es6系列-变量声明

    es6系列所有文章都是阅读阮一峰老师的<ES6标准入门>(第2版)所做的读书笔记.方便日后查阅相关基础知识. git地址: https://github.com/rainnaZR/es6- ...

  4. [simple-orm-mybaits]基于Mybatis的ORM封装介绍

    目录 前言 ORM框架现状 Mybatis优缺点 simple-orm-mybatis设计思路介绍 simple-orm-mybatis使用说明 simple-orm-mybatis实际使用 推荐最佳 ...

  5. 邁向IT專家成功之路的三十則鐵律 鐵律六:求全求盈之道-佈施

    如果您只是在IT方面的專業技術與經驗相當高超,而不懂得在日常生活之中當一位俠義肝膽之人,來隨時隨地伸手幫助身旁需要幫助的人,那麼您只能算是一位有勇有謀但卻無智慧的匹夫罷了.既是匹夫那麼即便成功也會是短 ...

  6. Go Programming Blueprints 读书笔记(谈到了nsq/mgo处理数据持久化,可是业务逻辑不够复杂)

    Go Programming Blueprints http.Handle("/", &templateHandler{filename: "chat.html& ...

  7. odoo税金处理

    税金可以设置为'税金包含在价格中',或者'税金不包含在价格中'.         在税金计算处理过程中,odoo会将价格/金额按 total_included/ total_exincluded 分开 ...

  8. sh脚本——#!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  9. java与MFC中的一些常识

    一个.java文件中可以有很多类.不过注意以下几点:1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个)2.这个.java文件的文件名必须是public类的类名(一般的情况下,这里 ...

  10. EasyUI datagrid border处理,加边框,去边框,都可以,easyuidatagrid

    下面是EasyUI 官网上处理datagrid border的demo: 主要是这句: $('#dg').datagrid('getPanel').removeClass('lines-both li ...