/*
*   一笑奈何
*   cn-yixiaonaihe.blog.csdn.net
*/#include <iostream>
#include <thread>
extern "C" {
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
#include "libswscale/swscale.h"
#include "libswresample/swresample.h"
}
using namespace std;
static double r2d(AVRational r)
{return r.den == 0 ? 0 : (double)r.num / (double)r.den;
}
void XSleep(int ms)
{//c++ 11chrono::milliseconds du(ms);this_thread::sleep_for(du);
}
int main(int argc, char *argv[])
{cout << "Test Demux FFmpeg.club" << endl;const char *url = "test.pcm";const char *outfile = "test.aac";//初始化封装库av_register_all();//初始化网络库 (可以打开rtsp rtmp http 协议的流媒体视频)avformat_network_init();//注册解码器avcodec_register_all();//1 打开音频编码器AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_AAC);if (!codec){cout << "avcodec_find_encoder NO" << endl;return -1;}AVCodecContext *c = avcodec_alloc_context3(codec);if (!codec){cout << "avcodec_alloc_context3 NO" << endl;return -1;}c->bit_rate = 64000;c->sample_rate = 44100;c->sample_fmt = AV_SAMPLE_FMT_FLTP;c->channel_layout = AV_CH_LAYOUT_STEREO;c->channels = 2;c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;int ret = avcodec_open2(c, codec, NULL);if (ret < 0){cout << "avcodec_open2 NO" << endl;return -1;}cout << "avcodec_open2 OK" << endl;//2 打开输出封装上下文AVFormatContext *oc = NULL;avformat_alloc_output_context2(&oc, NULL,NULL,outfile);if (!oc){cout << "avformat_alloc_output_context2 NO" << endl;return -1;}AVStream *st = avformat_new_stream(oc, NULL);st->codecpar->codec_tag = 0;avcodec_parameters_from_context(st->codecpar, c);av_dump_format(oc, 0, outfile, 1);//3  open io & write head ret=avio_open(&oc->pb, outfile, AVIO_FLAG_WRITE);if (ret<0){cout << "avio_open NO" << endl;return -1;}ret = avformat_write_header(oc,NULL);//44100 16位 双通道//4 创建音频重采样上下文//音频重采样 上下文初始化SwrContext *actx = swr_alloc();actx = swr_alloc_set_opts(actx,c->channel_layout,  //输出格式c->sample_fmt,                 //输出样本格式c->sample_rate,                  //输出采样率AV_CH_LAYOUT_STEREO,//输入格式AV_SAMPLE_FMT_S16,44100,0, 0);ret = swr_init(actx);if (ret != 0){char buf[1024] = { 0 };av_strerror(ret, buf, sizeof(buf) - 1);cout << "swr_init  failed! :" << buf << endl;return -1;}//5 打开输入音频文件进行重采样AVFrame *frame = av_frame_alloc();frame->format = AV_SAMPLE_FMT_FLTP;frame->channels = 2;frame->channel_layout = AV_CH_LAYOUT_STEREO;frame->nb_samples = 1024; //一帧音频存放的样本数量ret=av_frame_get_buffer(frame, 0);if (ret < 0){cout << "av_frame_get_buffer No :" << endl;return -1;}char *pcm = NULL;int readSize = frame->nb_samples * 2 * 2;pcm = new char[readSize];FILE *fp = fopen(url,"rb");for (;;){int len = fread(pcm, 1, readSize, fp);if (len <= 0)break;const uint8_t *data[1];data[0] = (uint8_t*)pcm;ret = swr_convert(actx,frame->data, frame->nb_samples,     //输出data, frame->nb_samples);    //输入if (len <= 0)break;AVPacket pkt;av_init_packet(&pkt);//音频编码ret=avcodec_send_frame(c, frame);if (ret != 0)continue;ret = avcodec_receive_packet(c, &pkt);if (ret != 0)continue;//7 音频封装进AAC文件pkt.stream_index = 0;pkt.pts = 0;pkt.dts = 0;ret = av_interleaved_write_frame(oc, &pkt);cout << "[" << len << "]";}delete pcm;//写入视频索引尾部信息av_write_trailer(oc);//主动关闭后才可以把缓冲区的内容写到文件avio_close(oc->pb);//清理空间av_frame_free(&frame);//先关闭后释放swr_close(actx);swr_free(&actx);//清理封装输出上下文avformat_free_context(oc);//关闭编码器avcodec_close(c);//清理编码器上下文avcodec_free_context(&c);fclose(fp);cout << "==================end===============" << endl;return 0;}

【开源项目】基于FFmpeg的PCM数据编码为AAC相关推荐

  1. 基于FFmpeg的音频编码(PCM数据编码成AAC android)

    概述 在Android上实现录音,并利用 FFmpeg将PCM数据编码成AAC. 详细 代码下载:http://www.demodashi.com/demo/10512.html 之前做的一个demo ...

  2. DoNet开源项目-基于jQuery EasyUI的后台管理系统

    本文转载于 石佳劼的博客,有问题请到原文咨询,原文连接. 博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery Easy ...

  3. DoNet开源项目-基于Amaze UI的点餐系统

    本文转载于 石佳劼的博客,有问题请到原文咨询,原文连接. 点餐系统 帮朋友做的点餐系统,主要是为了让顾客在餐桌上,使用微信扫描二维码,就可以直接点菜,吃完使用微信付款. 系统演示地址,账户名和密码均为 ...

  4. 【FFmpeg】PCM编码成AAC

    使用FFmpeg把PCM裸数据编码成AAC音频流,具体步骤跟YUV编码成H264差不多. 1.命令行 ffmpeg -f s16le -ar 44100 -ac 2 -i bb1.pcm output ...

  5. 【开源项目】QT播放PCM音频实例详细

    #include<QtCore/QCoreApplication> #include<QAudioFormat> #include<QAudioOutput> #i ...

  6. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  7. Web 自动化解决方案 [开源项目] 基于 Selenium 的 Web 自动化测试框架完美版

    欢迎查阅Selenium(Web自动化测试框架体系) Selenium ) Selenium是一个用于Web应用程序的自动化测试工具,直接运行在浏览器中,就像真正的用户在操作一样• 支持的浏览器包括I ...

  8. 开源项目-基于小熊派STM32红外热成像仪

    点击上方"嵌入式应用研究院",选择"置顶/星标公众号" 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 中秋假期 ...

  9. 【开源项目】基于FFmpeg的PCM和RGB数据统一封装

    项目采用工程模式进行构造. 技术解决难点: 1.编码后的PTS时间一定要赋值.2.音视频封装同步问题,其中涉及到PTS同步问题,例如视频25PTS/s  音频43PTS/s(44100采样率/1024 ...

最新文章

  1. linux怎么进入root文件,linux下安装ROOT过程
  2. leach协议matlab仿真代码
  3. angularjs(1)
  4. 学习机器学习:这10年我们能在各自的领域做点什么?
  5. 你的微信昵称,正在暴露你!
  6. 一个类实现多个接口的demo
  7. 用 Python 控制你的鼠标和键盘,然后爱怎么玩怎么玩
  8. centos6.5 mysql5.6主从复制
  9. Android-Parcelable理解与使用(对象序列化)
  10. java----JUnit
  11. 一种基于深度神经网络的临床记录ICD自动编码方法
  12. android模拟器pc版知乎,知乎答题王电脑版下载 安卓模拟器图文安装教程
  13. 如何下载B站视频,解决视频没有声音/音画分离问题(IDM+Potplayer)
  14. FreeRTOS-CortexM4-相关函数说明
  15. 周末之个人杂想(十五)
  16. 第②波 | 纯福利,无套路资源分享~
  17. pandas:世界各国GDP数据集数据清洗案例
  18. [ACL2017]Going out on a limb:Joint Extraction of Entity Mentions and Relations without Depende...
  19. ssh 连接其他服务器
  20. 点沙成金:半导体芯片(转载)

热门文章

  1. jooq映射原理_JOOQ事实:从JPA批注到JOOQ表映射
  2. glassfish hk2_使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证
  3. 将JAR依赖项添加到Eclipse插件Maven Tycho构建
  4. osgi和spring区别_OSGI和Spring动态模块–简单的Hello World
  5. dbunit使用_使用dbUnit,JSON,HSQLDB和JUnit规则进行数据库单元测试
  6. Java EE状态会话Bean(EJB)示例
  7. Java Priority Queue(PriorityQueue)示例
  8. Java 7:HashMap与ConcurrentHashMap
  9. 评论:Arun Gupta撰写的“ Java EE 6 Pocket Guide”
  10. 使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)