http://zhq.ahau.edu.cn/blog/article/464.htm
好久没有写东西了, 八月份写过一篇<提取 SWF 中的音频>, 这篇写 FLV 中提取音频, 算是上篇的姊妹篇. 本篇在一个多月之前就开了头, 并且代码也写好了, 每次想完成本文都不了了之了. 哎, 变懒了.
这次使用的 FLV 操作组件还是 SwfDotNet, 不过此组件对 FLV 操作部分没有开发完毕, 使用的时候完善了一部分代码, 并修改了一部分错误, 最后总算提取音频部分成功.
修改 SwfDotNet 类库的时候参考了Adobe 官方的 <Video File Format Specification Version 9>. 这个格式文档不但包括 FLV 格式说明, 还包括 F4V 格式说明.
FLV 文件字节编码格式为 BigEndianUnicode , SwfDotNet 内已经把处理方法给封装好了, 但不知道使用.Net框架的附带默认编码处理方式是否可以, SwfDotNet 作者把框架内好多附带方法都重新实现了一边, 这个不清楚为啥.
FLV 文件结构主要由两部分组成, Header 部分与 TAG 组部分. Header 的长度和结构是固定的, 前三个字节为固定的FLV标志, 其他的表示当前FLV文件是否有音频或视频部分, 还有一些空白的字节, 总共为9个字节. TAG 组为由三类 FLVTAG 和UI32类型的PreviousTagSize 交替组成, PreviousTagSize 标识其前的FLVTAG的大小, FLVTAG的基本结构为:
字段名称
类型
说明
TagType |
UI8 |
本TAG的类型. 可取值:
- 8: audio
- 9: video
- 18: script data
- 其他的: 保留
|
DataSize |
UI24 |
Data字段的数据长度 |
Timestamp |
UI24 |
无用? |
TimestampExtended |
UI8 |
对上面的字段扩展之用 |
StreamID |
UI24 |
总是 0 |
Data |
- If TagType = 8
AUDIODATA
- If TagType = 9
VIDEODATA
- If TagType = 18
SCRIPTDATAOBJECT
|
TAG 数据字段, 主要的数据就在这个里面. 本字段的数据类型取决与TagType内的值 |
实际上只要关心三个字段:TagType/DataSize/Data. 从TagType来判断Data字段的类型, Data字段的大小从DataSize字段来确定. 对于音频格式来说只要处理TagType为8的Data字段数据, 其他的TagType按着DataSize的大小偏移, 忽略掉.
三类 FLVTAG 实际上就是上面结构中的 TagType 值:
- 8 AUDIO TAG 音频TAG (音频结构的TAG, 也是本文处理时所关心的. 本TAG类似与 SWF中的 DefineSound TAG)
- 9 VIDEO TAG 视频TAG (视频结构的TAG, 类似于SWF中的VideoFrame TAG. 此TAG实际上才是FLV的视频.)
- 18 SCRIPTDATAOBJECT TAG 脚本数据对象TAG(保存FLV部分元数据之用)
AUDIO TAG的Data结构为:
字段称
类型
说明
SoundFormat |
UB[4]
0 = Linear PCM, platform endian 1 = ADPCM 2 = MP3 3 = Linear PCM, little endian 4 = Nellymoser 16-kHz mono 5 = Nellymoser 8-kHz mono 6 = Nellymoser 7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved 10 = AAC 14 = MP3 8-Khz 15 = Device-specific sound
|
SoundData 字段内音频的存储格式
格式7, 8, 14, 15 保留专用
格式10 (AAC) 只有在 Flash Player 9.0.115.0 及以上版本提供.
这里只关心 MP3 格式的, 因为其他编号的还不确定咋样处理.
|
SoundRate |
UB[2] 0 = 5.5-kHz 1 = 11-kHz 2 = 22-kHz 3 = 44-kHz |
取样率 对AAC格式: 总为 3
|
SoundSize |
UB[1] 0 = snd8Bit 8位 1 = snd16Bit 16位
|
每个取样的大小 对AAC格式: 总为 1
实际本字段为一个逻辑类型字段
|
SoundType |
UB[1] 0 = sndMono 单声道 1 = sndStereo 立体声
|
标示是 立体或单声道的声音 对于Nellymoser格式: 总为 0 对于AAC格式: 总为 1
本字段也可以理解为逻辑类型字段
|
SoundData |
UI8[sound data长度] |
如果 SoundFormat 字段为 10 本数据为 AACAUDIODATA 类型的音频数据(本文忽略处理) 否则为实际的音频数据
对于MP3格式的音频数据直接将本字段的数据当成MP3数据来处理
|
SoundFormat/SoundRate/SoundSize/SoundType 加起来正好一个字节, 使得 SoundData 字段的数据大小为 FLVTAG 内 DataSize 字段的值减1.
前面已经指出"每一个FLVTAG 字段之后有一个UI32类型的PreviousTagSize" 其内的值正好为其前的FLVTAG长度, 这个部分应该校验之用.
从上面来算如果直接提取FLV的时候需要以下几步:
- 偏移9个字节
- 空一个3字节长度的UI32类型的PreviousTagSize0
- 读一个字节的UI8类型的TagType字段, 如果本字段为8处理音频数据, 其他的部分, 按下一步获得的DataSize值偏移制定的字节
- 再读3个字节的UI24类型的DataSize字段, 确定SoundData部分的数据大小
- 对于AUDIODATA 读取4Bit 判断是否为MP3类型的数据, 如果非MP3格式的也按着DataSize大小偏移忽略掉
- 偏移4位, 开始获取SoundData部分数据. SoundData的大小从第三步获得的DataSize来确定大小, 应该为 DataSize-1
- 偏移3个字节长度的UI32类型的PreviousTagSize部分
- 重复第三步
经过上面操作讲获得的全部的SoundData数据合并输出到一个MP3扩展名的文件. 不过本篇文章中没有使用上面的方法, 计划在下一篇中贴出实现代码.
下面是使用SwfDotNet 的实现代码:
/// <summary>
/// 输出FLV音频部分
/// </summary>
private void FlvOutSound()
{
string fileName = Path.GetFileName(flvFile);
string outFileFileName = string.Format("{0}.{1}", fileName, "mp3");
//读取FLV文件
FlvReader flvReader = new FlvReader(flvFile, true);
Flv flv = flvReader.ReadFlv();
using (FileStream stream = new FileStream(Path.Combine(outPath, outFileFileName), FileMode.OpenOrCreate, FileAccess.Write))
{
foreach (FlvBaseTag tag in flv.Tags)
{
//只处理AudioTAG
if (tag is FlvAudioTag)
{
FlvAudioTag audio = tag as FlvAudioTag;
//输出到文件
stream.Write(audio.SoundData, 0, audio.SoundData.Length);
}
}
}
}
/// <summary>
/// 输入的FLV文件
/// </summary>
string flvFile = null;
/// <summary>
/// 输出的MP3文件目录
/// </summary>
string outPath = null;
SwfDotNet 类库 FlvReader.cs 内的处理错误部分纠正
/// <summary>
/// Reads the tag.
/// </summary>
/// <returns></returns>
private FlvBaseTag ReadTag()
{
FlvBaseTag resTag = null;
//不读取, 只测试当前的Tag 类型
byte tagType = br.PeekByte();
switch (tagType)
{
case (byte) FlvTagCodeEnum.Audio:
resTag = new FlvAudioTag();
break;
case (byte)FlvTagCodeEnum.Video: //这个处理部分和FlvScriptTag内的处理一致, 只是简单的偏移
resTag = new FlvVideoTag();
break;
case (byte)FlvTagCodeEnum.Script:
default:
resTag = new FlvScriptTag();
break;
}
resTag.ReadData(version, br);
br.ReadUInt32();
return resTag;
}
主要的代码就这么点, 好像有点头重脚轻. 不过功能是全部实现了. 全部完成了想说明一下FLV中提取音频的用处. 因为自己喜欢听相声, 在几个播客网站下载了好多的视频, 但大部分是FLV类型的, FLV的视频部分视乎是多余, 插上耳机听就可以了, 也不常看视频部分, 所以就有了本文的想法, 不过总算难度不大.
下一篇计划写关于"摆脱 SwfDotNet 类库提取音频"的实现代码部分.
本文主要参考: <Video File Format Specification Version 9>.
这里是代码. 下载地址:
天冷了, 注意保暖.
TUPUNCO
2008.11.19
好运每一天.
分享到:
相关推荐
4.提取FLV文件的AAC音频流,保存到.aac文件中 代码经过测试可以以上功能都可以实现。 使用暴风影音可以播放成功提取的aac文件 使用迅雷看看可以播放成功提取的H264文件 编译平台:VS2013 控制台模式编程
是一个视频工具,可以将FLV文件中的音频和视频提取出来。它使用方便,效果也很好,可以将视频文件保存为支持H.263/FLV1和VP6/FLV4的AVI格式,音频文件保存为MP3格式 FLV Extract是一款可快速从Flv格式文件中提取...
本文将深入探讨FLV音频提取的过程、工具和技术,以及其在实际应用中的价值。 一、FLV音频格式基础 FLV文件由视频数据和音频数据组成,其中音频通常采用AAC(Advanced Audio Coding)或MP3编码。这种格式的优点在于...
本项目涉及到的核心技术是提取FLV文件中的视频和音频数据,这是一个涉及到多媒体处理和文件解析的过程。下面将详细阐述相关知识点。 1. FLV文件格式: FLV文件由多个数据块组成,每个块包含头部信息和数据体。头部...
以下是一些关于如何进行FLV音频视频提取的重要知识点: 1. **FLV文件结构**:FLV文件由一系列的tag组成,每个tag包含音频、视频帧或元数据。音频通常是AAC或MP3编码,而视频则常为H.264编码。理解这一结构是进行...
它可以方便地从网络下载的FLV视频中提取音频作为背景音乐,或者从教育课程视频中提取关键帧进行复习。同时,对于内容创作者来说,这款工具可以帮助他们从现有素材中提取部分片段,用于新的创作项目。 总的来说,FLV...
FLV是现在视频网站最...将FLV中的音频与视频文件分离出来,可以分成AVI的视频格式和MP3的音频格式。 AVI视频格式无声音,喜欢配音的到可以考虑下。 MP3音质很不错。 注意!:本软件需要Microsoft .NET Framework 支持
《C# FLV音频提取器:深入解析与应用》 C# FLV音频提取器是一款专为处理FLV(Flash Video)格式文件而设计的实用工具。它利用.NET Framework的强大功能,可以方便快捷地从FLV文件中提取出音频部分,使得用户无需...
转换过程中,音频编码器会按照MP3的标准对FLV音频进行重新编码,确保兼容性和可播放性。常见的工具,如FFmpeg,可以方便地执行这种转换操作,它是一个强大的跨平台命令行工具,支持各种多媒体格式的处理。 提取音频...
FLV音频提取是一种技术,主要用于从FLV(Flash Video)文件中单独提取出音频轨道,以便于用户可以单独处理音频部分,例如用于制作音乐播放列表、编辑或转换为其他音频格式。FLV是Adobe Flash平台广泛使用的视频格式...
提取Flv文件中的音频的工具 使用方法: 1.提取程序所在文件夹中的所有flv(f4v)文件。 将FlvAudio程序放入有flv或f4v的文件夹中,双击运行,运行完毕后目录中就会生成与原文件同名的mp3或aac文件了。 2.提取...
FLV音频提取工具是一款专为用户设计的实用软件,它能高效、便捷地从FLV视频文件中分离出音频部分,让使用者能够单独保存或处理这些音频内容。FLV是Flash Video的缩写,是一种流行的网络流媒体格式,广泛应用于在线...
本文将详细讲解如何进行FLV音频提取,以及涉及到的相关技术。 首先,我们需要了解FLV文件结构。FLV文件由头信息、数据块和尾部信息组成。其中,数据块包含了视频帧和音频帧,它们是交错存储的。音频帧通常采用AAC或...
软件简介:把FLV中的视频和音频資源提取出來。這个工具其实就是一個分离器(Splitter),所以转换的速度非常快,也不会有精度損失的问题。視频可提取AVI(H.263/FLV1)(VP6/VP6F)(H.264/AVC),音频可提取MP3,AAC(ADTS...
标题中的“FLV格式视频背景音频提取器”指的是一个专门用于从FLV视频文件中分离并提取音频的工具。FLV是一种常见的网络流媒体格式,常用于在线视频分享平台,如YouTube。这种格式的视频可能包含音频轨道,而这个提取...
- **音频提取**:如果FLV文件中的音频是你需要的部分,可以直接提取出来,作为背景音乐或其他音频项目使用。 - **格式转换**:提取出的视频和音频可以分别转换为其他格式,以适应不同的设备或平台。 总结,FLV ...
标题中的“VB提取FLV流媒体音频文件”指的是使用Visual Basic(VB)编程语言来从FLV(Flash Video)格式的流媒体文件中提取音频数据。FLV是一种常见的网络视频格式,尤其在早期的网页视频中广泛应用。VB作为微软开发...
提取Flv文件中的音频的工具 使用方法: 1.提取程序所在文件夹中的所有flv(f4v)文件。 将FlvAudio程序放入有flv或f4v的文件夹中,双击运行,运行完毕后目录中就会生成与原文件同名的mp3或aac文件了。 2.提取指定...