如何使用FFmpeg抽取音视频的音频数据,代码如下:

void adts_header(char *szAdtsHeader, int dataLen);

// 使用FFmpeg从视频中抽取音频
void extractAudio() { // 设置日志输出等级
av_log_set_level(AV_LOG_INFO); AVFormatContext *fmt_ctx = NULL;
AVPacket pkt; av_register_all(); int ret;
int len;
int audio_index = -; // 打开输入文件
ret = avformat_open_input(&fmt_ctx, "111.mp4", NULL, NULL); // 检查打开输入文件是否成功
if (ret < ) {
printf("cant open file,error message = %s", av_err2str(ret));
return;
} // 打开输入文件成功,打印一下Meta信息
// av_dump_format(fmt_ctx, 0, "111.flv", 0); // 打开输出文件
FILE* dst_fd = fopen("111.aac", "wb"); // w 写入 b 二进制文件 // 检查输出文件打开是否成功,如果失败,就输出日志,并关闭输出文件的引用
if (!dst_fd) {
av_log(NULL, AV_LOG_ERROR, "Can't Open Out File!\n");
avformat_close_input(&fmt_ctx);
} // 获取到音频流(使用av_find_best_stream:多媒体文件中拿到想使用的最好的一路流) av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = ; ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -, -, NULL, );
for (int i = ; i < fmt_ctx->nb_streams; i++) {
if (fmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
audio_index = i;
break;
}
} printf("Audio Stream Index = %d", audio_index); // 检查发现音频流的结果
if (audio_index < ) {
av_log(NULL, AV_LOG_ERROR, "Can't find Best Audio Stream!\n");
//printf("Reason = %s", av_err2str(ret));
// 关闭输出文件和输出文件的引用
avformat_close_input(&fmt_ctx);
fclose(dst_fd);
return;
} while (av_read_frame(fmt_ctx, &pkt) >= ) {
if (pkt.stream_index == audio_index) {
printf("Has Read An Audio Packet\n");
char adts_header_buf[];
adts_header(adts_header_buf, pkt.size);
fwrite(adts_header_buf, , , dst_fd);
len = fwrite(pkt.data, , pkt.size, dst_fd);
if (len != pkt.size) {
av_log(NULL, AV_LOG_WARNING, "Waring! Length of data not equal size of pkt!\n");
}
}
// 将引用基数减一
av_packet_unref(&pkt);
//av_free_packet(&pkt);
} // 关闭文件(输入/输出)
avformat_close_input(&fmt_ctx);
if (dst_fd) {
fclose(dst_fd);
}
} void adts_header(char *szAdtsHeader, int dataLen) {     int audio_object_type = 2;
    int sampling_frequency_index = 7;
    int channel_config = 2;     int adtsLen = dataLen + 7;     szAdtsHeader[0] = 0xff;         //syncword:0xfff                          高8bits
    szAdtsHeader[1] = 0xf0;         //syncword:0xfff                          低4bits
    szAdtsHeader[1] |= (0 << 3);    //MPEG Version:0 for MPEG-4,1 for MPEG-2  1bit
    szAdtsHeader[1] |= (0 << 1);    //Layer:0                                 2bits
    szAdtsHeader[1] |= 1;           //protection absent:1                     1bit     szAdtsHeader[2] = (audio_object_type - 1) << 6;            //profile:audio_object_type - 1                      2bits
    szAdtsHeader[2] |= (sampling_frequency_index & 0x0f) << 2; //sampling frequency index:sampling_frequency_index  4bits
    szAdtsHeader[2] |= (0 << 1);                             //private bit:0                                      1bit
    szAdtsHeader[2] |= (channel_config & 0x04) >> 2;           //channel configuration:channel_config               高1bit     szAdtsHeader[3] = (channel_config & 0x03) << 6;     //channel configuration:channel_config      低2bits
    szAdtsHeader[3] |= (0 << 5);                      //original:0                               1bit
    szAdtsHeader[3] |= (0 << 4);                      //home:0                                   1bit
    szAdtsHeader[3] |= (0 << 3);                      //copyright id bit:0                       1bit  
    szAdtsHeader[3] |= (0 << 2);                      //copyright id start:0                     1bit
    szAdtsHeader[3] |= ((adtsLen & 0x1800) >> 11);           //frame length:value   高2bits     szAdtsHeader[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);     //frame length:value    中间8bits
    szAdtsHeader[5] = (uint8_t)((adtsLen & 0x7) << 5);       //frame length:value    低3bits
    szAdtsHeader[5] |= 0x1f;                                 //buffer fullness:0x7ff 高5bits
    szAdtsHeader[6] = 0xfc;
}

(目前AAC格式不是很明确,代码运行存在问题,待学习AAC完成后,再完善)

FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据的更多相关文章

  1. FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据

    如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...

  2. FFmpeg简易播放器的实现-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...

  3. 获取音视频文件AVMetadata数据

    获取音视频文件AVMetadata数据 问题来源: http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-i ...

  4. libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作

    http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...

  5. FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息

    在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...

  6. FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件

    本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...

  7. FFmpeg开发实战(一):FFmpeg 打印日志

    在Visual Studio 开发(二):VS 2017配置FFmpeg开发环境一文中,我们配置好了FFmpeg的开发环境,下面我们开始边实战,边学习FFmpeg. 首先,我们要学习的就是FFmpeg ...

  8. ffmpeg 2.3版本号, 关于ffplay音视频同步的分析

    近期学习播放器的一些东西.所以接触了ffmpeg,看源代码的过程中.就想了解一下ffplay是怎么处理音视频同步的,之前仅仅大概知道通过pts来进行同步,但对于怎样实现却不甚了解,所以想借助这个机会, ...

  9. Android IOS WebRTC 音视频开发总结(五五)-- 音视频通讯中的抗丢包与带宽自适应原理

    本文主要分析webrtc中的抗丢包与带宽自适应原理,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 文章内容主要来自中国电信北京研究院丁博士在 ...

随机推荐

  1. [奇思异想]使用Zookeeper管理数据库连接串

    背景 有一套特定规格的应用(程序+数据库),当有业务需求时,就需要多部署应用,并且所有的应用都使用一个共同的后台来管理.应用新增后,如何通知后台更新连接串成了一个关键的问题.于是就产生了使用ZooKe ...

  2. 注册httpmonitor提示 模块“httpMonitor.dll"加载失败

    注册HttpMonitor.dll提示失败,经过查看系统日志,发现原来是缺少依赖 从网上下载相关dll,放在同目录下,再次regsvr32 HttpMonitor.dll注册成功! 附上下载地址: h ...

  3. Jmeter中基本操作

    Jmeter中基本操作包括 1:线程组 2:HTTP信息头管理器 3:HTTP请求默认值 4:HTTP请求 5:查看结果树 操作步骤如下: 1.创建一个线程组 通俗的讲一个线程组,,可以看做一个虚拟用 ...

  4. 打包github上的项目,并在本地使用

    在GitHub上去找工具并把地址克隆下来 在本地创建一个文件夹,文件夹内右击 (建议路径为英文,并保证本机有github的软件: https://jingyan.baidu.com/article/9 ...

  5. 003 css总结

    1.题目 有哪项方式可以对一个DOM设置它的CSS样式? CSS都有哪些选择器? CSS选择器的优先级是怎么样定义的? CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内? 超链 ...

  6. python3中列表、元组、字典的增删改查说明详解

    python基础中的列表.元组.字典属于python中内置的序列数据结构.其中序列可以进行的操作包括索引.截取(切片).加.乘.成员检查等. 1.列表 列表(list)是最常用的python数据类型之 ...

  7. PBRT笔记(11)——光源

    自发光灯光 至今为止,人们发明了很多光源,现在被广泛使用的有: 白炽灯的钨丝很小.电流通过灯丝时,使得灯丝升温,从而使灯丝发出电磁波,其波长的分布取决于灯丝的温度.但大部分能量都被转化为热能而不是光能 ...

  8. tensorflow 使用 4 非线性回归

    # 输入一个 x 会计算出 y 值 y 是预测值,如果与 真的 y 值(y_data)接近就成功了 import tensorflow as tf import numpy as np # py 的画 ...

  9. 关于各种工具输入参数中"-"和"--"

    关于各种工具输入参数中"-"和"--" 写个随笔记录下来 一直搞不懂,为啥在使用很多工具的时候,他的参数要加的"-"数量不一样呢? 如果输入 ...

  10. c# asp.net mvc使用斑马GK888t打印机打印标签

    前言 c#语言,asp.net mvc,南京都昌电子病历模板工具(类似word),斑马GK888t,打印手腕带和标签纸. 实现步骤为:在页面上显示一个或多个都昌模板工具,点击页面上的button,出现 ...