`
st780206
  • 浏览: 47904 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

提取 FLV 中的音频

阅读更多

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的时候需要以下几步:

  1. 偏移9个字节
  2. 空一个3字节长度的UI32类型的PreviousTagSize0
  3. 读一个字节的UI8类型的TagType字段, 如果本字段为8处理音频数据, 其他的部分, 按下一步获得的DataSize值偏移制定的字节
  4. 再读3个字节的UI24类型的DataSize字段, 确定SoundData部分的数据大小
  5. 对于AUDIODATA 读取4Bit 判断是否为MP3类型的数据, 如果非MP3格式的也按着DataSize大小偏移忽略掉
  6. 偏移4位, 开始获取SoundData部分数据. SoundData的大小从第三步获得的DataSize来确定大小, 应该为 DataSize-1
  7. 偏移3个字节长度的UI32类型的PreviousTagSize部分
  8. 重复第三步

经过上面操作讲获得的全部的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

好运每一天.

 

分享到:
评论

相关推荐

    FLV格式解析和提取FLV中的H264视频流和AAC音频流代码

    4.提取FLV文件的AAC音频流,保存到.aac文件中 代码经过测试可以以上功能都可以实现。 使用暴风影音可以播放成功提取的aac文件 使用迅雷看看可以播放成功提取的H264文件 编译平台:VS2013 控制台模式编程

    提取FLV中的音频和视频

    是一个视频工具,可以将FLV文件中的音频和视频提取出来。它使用方便,效果也很好,可以将视频文件保存为支持H.263/FLV1和VP6/FLV4的AVI格式,音频文件保存为MP3格式 FLV Extract是一款可快速从Flv格式文件中提取...

    flv音频提取器

    本文将深入探讨FLV音频提取的过程、工具和技术,以及其在实际应用中的价值。 一、FLV音频格式基础 FLV文件由视频数据和音频数据组成,其中音频通常采用AAC(Advanced Audio Coding)或MP3编码。这种格式的优点在于...

    提取FLV文件的视频和音频

    本项目涉及到的核心技术是提取FLV文件中的视频和音频数据,这是一个涉及到多媒体处理和文件解析的过程。下面将详细阐述相关知识点。 1. FLV文件格式: FLV文件由多个数据块组成,每个块包含头部信息和数据体。头部...

    FLV 音频视频提取

    以下是一些关于如何进行FLV音频视频提取的重要知识点: 1. **FLV文件结构**:FLV文件由一系列的tag组成,每个tag包含音频、视频帧或元数据。音频通常是AAC或MP3编码,而视频则常为H.264编码。理解这一结构是进行...

    FLV提取视频分离器(flv提取音频)V1.1 正式版

    它可以方便地从网络下载的FLV视频中提取音频作为背景音乐,或者从教育课程视频中提取关键帧进行复习。同时,对于内容创作者来说,这款工具可以帮助他们从现有素材中提取部分片段,用于新的创作项目。 总的来说,FLV...

    提取FLV中的MP3音频和AVI视频

    FLV是现在视频网站最...将FLV中的音频与视频文件分离出来,可以分成AVI的视频格式和MP3的音频格式。 AVI视频格式无声音,喜欢配音的到可以考虑下。 MP3音质很不错。 注意!:本软件需要Microsoft .NET Framework 支持

    C#FLV音频提取器

    《C# FLV音频提取器:深入解析与应用》 C# FLV音频提取器是一款专为处理FLV(Flash Video)格式文件而设计的实用工具。它利用.NET Framework的强大功能,可以方便快捷地从FLV文件中提取出音频部分,使得用户无需...

    flv2mp3 flv中提取音频

    转换过程中,音频编码器会按照MP3的标准对FLV音频进行重新编码,确保兼容性和可播放性。常见的工具,如FFmpeg,可以方便地执行这种转换操作,它是一个强大的跨平台命令行工具,支持各种多媒体格式的处理。 提取音频...

    FLV音频提取

    FLV音频提取是一种技术,主要用于从FLV(Flash Video)文件中单独提取出音频轨道,以便于用户可以单独处理音频部分,例如用于制作音乐播放列表、编辑或转换为其他音频格式。FLV是Adobe Flash平台广泛使用的视频格式...

    Flv音频提取器 FlvAudio V1.0

    提取Flv文件中的音频的工具 使用方法: 1.提取程序所在文件夹中的所有flv(f4v)文件。 将FlvAudio程序放入有flv或f4v的文件夹中,双击运行,运行完毕后目录中就会生成与原文件同名的mp3或aac文件了。 2.提取...

    flv音频提取工具.rar

    FLV音频提取工具是一款专为用户设计的实用软件,它能高效、便捷地从FLV视频文件中分离出音频部分,让使用者能够单独保存或处理这些音频内容。FLV是Flash Video的缩写,是一种流行的网络流媒体格式,广泛应用于在线...

    flv提取音频

    本文将详细讲解如何进行FLV音频提取,以及涉及到的相关技术。 首先,我们需要了解FLV文件结构。FLV文件由头信息、数据块和尾部信息组成。其中,数据块包含了视频帧和音频帧,它们是交错存储的。音频帧通常采用AAC或...

    FLV文件音频提取器

    软件简介:把FLV中的视频和音频資源提取出來。這个工具其实就是一個分离器(Splitter),所以转换的速度非常快,也不会有精度損失的问题。視频可提取AVI(H.263/FLV1)(VP6/VP6F)(H.264/AVC),音频可提取MP3,AAC(ADTS...

    FLV格式视频背景音频提取器

    标题中的“FLV格式视频背景音频提取器”指的是一个专门用于从FLV视频文件中分离并提取音频的工具。FLV是一种常见的网络流媒体格式,常用于在线视频分享平台,如YouTube。这种格式的视频可能包含音频轨道,而这个提取...

    FLV Extract 1.61(FLV资源提取)

    - **音频提取**:如果FLV文件中的音频是你需要的部分,可以直接提取出来,作为背景音乐或其他音频项目使用。 - **格式转换**:提取出的视频和音频可以分别转换为其他格式,以适应不同的设备或平台。 总结,FLV ...

    VB提取FLV 流媒体音频文件.rar

    标题中的“VB提取FLV流媒体音频文件”指的是使用Visual Basic(VB)编程语言来从FLV(Flash Video)格式的流媒体文件中提取音频数据。FLV是一种常见的网络视频格式,尤其在早期的网页视频中广泛应用。VB作为微软开发...

    FlvAudio V1.0 (Flv音频提取器)

    提取Flv文件中的音频的工具 使用方法: 1.提取程序所在文件夹中的所有flv(f4v)文件。 将FlvAudio程序放入有flv或f4v的文件夹中,双击运行,运行完毕后目录中就会生成与原文件同名的mp3或aac文件了。 2.提取指定...

Global site tag (gtag.js) - Google Analytics