FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据
如何使用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 抽取音视频的音频数据的更多相关文章
- FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据
如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- 获取音视频文件AVMetadata数据
获取音视频文件AVMetadata数据 问题来源: http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-i ...
- libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作
http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...
- FFmpeg开发实战(三):FFmpeg 打印音视频Meta信息
在之前使用FFmpeg命令行的时候,我们经常看到FFmpeg命令行在输出音视频文件的会打印一下文件的Meta信息,类似如图: 那么我们如何通过代码的方式输出这些Meta信息呢? FFmpeg提供了一个 ...
- FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件
本文中实现的一个小功能是把一个YUV原始视频数据(时间序列图像)经过h264编码为视频码流,然后在使用mp4封装格式封装. 编码&封装的流程图如下: 使用ffmpeg编码流程: 1.首先使用a ...
- FFmpeg开发实战(一):FFmpeg 打印日志
在Visual Studio 开发(二):VS 2017配置FFmpeg开发环境一文中,我们配置好了FFmpeg的开发环境,下面我们开始边实战,边学习FFmpeg. 首先,我们要学习的就是FFmpeg ...
- ffmpeg 2.3版本号, 关于ffplay音视频同步的分析
近期学习播放器的一些东西.所以接触了ffmpeg,看源代码的过程中.就想了解一下ffplay是怎么处理音视频同步的,之前仅仅大概知道通过pts来进行同步,但对于怎样实现却不甚了解,所以想借助这个机会, ...
- Android IOS WebRTC 音视频开发总结(五五)-- 音视频通讯中的抗丢包与带宽自适应原理
本文主要分析webrtc中的抗丢包与带宽自适应原理,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 文章内容主要来自中国电信北京研究院丁博士在 ...
随机推荐
- jsp中一个标签两种方式绑定两个click事件导致未执行的问题
近日,在开发过程中,写了一个标签 <li id="a1" onclick="doSomething()">...</li> 在js页面中 ...
- vertx.FileResolver文件解析
FileResolver Class //文件复制解析,复制文件到cache directory 中 ,VM options : -Dvertx.disableFileCPResolving publ ...
- 主席树——树链上第k大spoj COT
首先要求第k大就想到用主席树来处理 但是不能直接用树链剖分的dfs序来维护,因为一条链对应的dfs下标可能是断开的几段,无法用权值线段树来维护 那么久维护每个点到根节点的全值线段树,结点u的权值线段树 ...
- .net core 使用swagger自动生成接口文档
前言 swagger是一个api文档自动生动工具,还集成了在线调试. 可以为项目自动生成接口文档, 非常的方便快捷 Swashbuckle.AspNetCore 是一个开源项目,用于生成 ASP.N ...
- Chrome插件触发web页面的事件
Chrome插件中不能直接调用Web页面的元素js,原因是chrome插件的机制http://stackoverflow.com/questions/17819344/triggering-a-cli ...
- Java读取证书
import java.io.FileInputStream; import java.security.Key; import java.security.KeyFactory; import ja ...
- 网络远程唤醒 WOL Magic Packet
Magic Packet Magic Packet白皮书介绍: The basic technical details of Magic Packet Technologyare simple and ...
- SignalR具有自签名SSL和自主机
SignalR具有自签名SSL和自主机 在研究中试过我的运气,但到目前为止还没有快乐. 我想将SignalR javascript客户端连接到自签名的SignalR Windows服务绑定到自签名 ...
- zabbix-tomcat监控
安装tomcat 1安装jdk # yum install lrzsz -y #tar xvf jdk # ln -sv /usr/local/src/jdk1..0_79/ /usr/local/j ...
- EJS 入门学习
EJS(Embedded JavaScript templates)是一个简单高效的模板语言,通过数据和模板,可以生成HTML标记文本.可以说EJS是一个JavaScript库,EJS可以同时运行在客 ...