[SimplePlayer] 4. 从视频文件中提取音频

提取音频,具体点来说就是提取音频帧。提取方法与从视频文件中提取图像的方法基本一样,这里仅列出其中的不同点:

1. 由于目的提取音频,因此在demux的时候需要指定的是提取audio stream

1
AudioStream = av_find_best_stream(pFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);

 

2. 在decode时,解码音频与解码视频分别采用的是不同的API

1
avcodec_decode_audio4(pCodecCtx, pFrame, &frameFinished, &packet);

 

3. 由于本播放器的音频输出实现是基于SDL,而SDL支持输出为S16的音频样本格式(也许是系统原因?),因此我们这里在保存文件时,如果解码出来的音频样本格式不是S16,那么就需要对其进行格式转换,以方便后续读取文件进行播放。下面以最常见的FLTP格式为例,把该格式的音频转换为S16格式的音频。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sample_count = pFrame->nb_samples;
channel0 = (float *)pFrame->extended_data[0];
channel1 = (float *)pFrame->extended_data[1];
 
//normal PCM is mixed(interleave) track, but fltp "p" means planar
if(pFrame->format == AV_SAMPLE_FMT_FLTP)
{
    for(i=0; i<sample_count; i++){ //stereo
        sample0 = (short)(channel0[i]*32767.0f);
        sample1 = (short)(channel1[i]*32767.0f);
        fwrite(&sample0, 2, 1, pFile);
        fwrite(&sample1, 2, 1, pFile);
    }
}
posted @   TaigaComplex  阅读(861)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2012-11-03 poll机制分析
2012-11-03 linux字符设备驱动驱动流程
2012-11-03 Linux按键驱动,中断实现流程
2012-11-03 编写Linux中断驱动时,由于头文件缺失引起的编译错误
点击右上角即可分享
微信分享提示