开源的.NET媒体文件操作组件TagLib#解析
来源:互联网 发布:js 定时器方法有参数 编辑:程序博客网 时间:2024/05/18 03:20
一.TagLib#组件概述
TagLib#用于处理媒体文件,例如视频,音频和照片等等,TagLib#采用LGPL和MPL两种开源协议。TagLib#是用于读取和编辑几种流行音频格式的元数据的库。目前,它支持 MP3文件的ID3v1和ID3v2,FLAC,MPC,Speex,WavPack,TrueAudio,WAV,AIFF,MP4和ASF文件中的Ogg Vorbis注释和ID3标签和Vorbis注释。
该组件属于比较老的一种了,在GitHub上一直都在更新修改。该库由2001年开始创建,但是该库一直有人在维护,需要使用到相关功能的同学,可以看看该组件。该组件的当前版本为2.1 。该库的地址:https://github.com/mono/taglib-sharp。
TagLib#(又名taglib-sharp)是一个用于阅读和写作的库媒体文件中的元数据,包括视频,音频和照片格式。
这个玩意的文档真是少,国内国外翻遍了,也没找到多少,写一篇不容易啊。
在这里提供一个该库的扩展:https://github.com/timheuer/taglib-sharp-portable,该扩展库支持.NET Framework 4.5+,Windows 8+,Windows Phone 8.1,Windows Phone Silverlight 8,Xamarin.Android,Xamarin.iOS。
二.TagLib#组件应用
上面介绍了组件的背景和简单的叙述,下面就该介绍一下简单的应用,毕竟无法应用的组件,没有介绍的意义。这里如果需要编写较为通用的组件代码,可以自己根据项目需求进行总结,欢迎大家将自己的知识进行分享,分享自己的知识积累。
1.解析照片
public static TagLib.File ParsePhoto(string path) { if (string.IsNullOrEmpty(path)) { throw new ArgumentNullException(path); } TagLib.File file; try { file = TagLib.File.Create(path); } catch (UnsupportedFormatException uex) { throw uex; } var image = file as TagLib.Image.File; if (file == null) { throw new ArgumentNullException("file"); } return image; }
2.从文件中加载图片
public static void Main(string [] args) { if(args.Length < 2) { Console.Error.WriteLine("USAGE: mono SetPictures.exe AUDIO_PATH IMAGE_PATH_1[...IMAGE_PATH_N]"); return; } TagLib.File file = TagLib.File.Create(args[0]); Console.WriteLine("Current picture count: " + file.Tag.Pictures.Length); Picture [] pictures = new Picture[args.Length - 1]; for(int i = 1; i < args.Length; i++) { Picture picture = new Picture(args[i]); pictures[i - 1] = picture; } file.Tag.Pictures = pictures; file.Save(); Console.WriteLine("New picture count: " + file.Tag.Pictures.Length); }
3.加载音频文件
var tagFile = TagLib.File.Create("ironlionzion.mp3");var tags = tagFile.GetTag(TagTypes.Id3v2);string album = tags.Album;
string genre = "Hip-Hop, Rock"; var matchingFiles = Directory.GetFiles(@"Folder\SubFolder", "*.mp3",
SearchOption.AllDirectories).Where(x => { var f = TagLib.File.Create(x);
return ((TagLib.Id3v2.Tag) f.GetTag(TagTypes.Id3v2)).JoinedGenres == genre; });foreach (string f in matchingFiles){ System.IO.File.Move(f, Path.Combine(@"D:\NewFolder", new FileInfo(f).Name));}
4.执行Tag
public byte[] ExecuteTagging(byte[] inputFile, string title, string artist, string album, string comment, uint year, string copyright, byte[] image) { var stream = new MemoryStream(); var writer = new BinaryWriter(stream); writer.Write(inputFile); using (var audioFile = TagLib.File.Create(new SimpleFileAbstraction(stream))) { audioFile.Tag.Title = title; audioFile.Tag.Performers = new[] { artist }; audioFile.Tag.Album = album; audioFile.Tag.Comment = comment; audioFile.Tag.Genres = new[] { "Podcast" }; audioFile.Tag.Year = year; audioFile.Tag.Copyright = copyright; audioFile.Tag.Pictures = new[] { new Picture(image) }; audioFile.Save(); } stream.Position = 0; using (var reader = new BinaryReader(stream)) { return reader.ReadBytes((int)stream.Length); } }
三.TagLib#组件核心对象解析
介绍完基本的用法,如果需要了解更多,可以取GitHub自行下载查看源码,有比较详细的介绍,这里就不再做赘述,下面介绍一个该组件的一些核心对象。
1.File.Create()
public static File Create (IFileAbstraction abstraction,string mimetype,ReadStyle propertiesStyle) { if(mimetype == null) { string ext = String.Empty; int index = abstraction.Name.LastIndexOf (".") + 1; if(index >= 1 && index < abstraction.Name.Length) ext = abstraction.Name.Substring (index,abstraction.Name.Length - index); mimetype = "taglib/" + ext.ToLower(CultureInfo.InvariantCulture); } foreach (FileTypeResolver resolver in file_type_resolvers) { File file = resolver(abstraction, mimetype,propertiesStyle); if(file != null)return file; } if (!FileTypes.AvailableTypes.ContainsKey(mimetype)) throw new UnsupportedFormatException ( String.Format (CultureInfo.InvariantCulture,"{0} ({1})",abstraction.Name,mimetype)); Type file_type = FileTypes.AvailableTypes[mimetype]; try { File file = (File) Activator.CreateInstance(file_type,new object [] {abstraction, propertiesStyle}); file.MimeType = mimetype; return file; } catch (System.Reflection.TargetInvocationException e) { PrepareExceptionForRethrow(e.InnerException); throw e.InnerException; } }
该方法用于创建一个File子类的新实例对于指定的文件抽象,mime类型和读取风格。该方法存在6个重载,接受两个参数,abstraction一个IFileAbstraction对象要使用的时候从当前实例读取和写入。mimetype包含mime类型的string对象在选择要使用的适当类时使用,或langword =null如果扩展名name abstraction被使用。propertiesStyle一个ReadStyle值指定的级别从...阅读媒体信息时使用的细节新实例。该方法返回一个File对象,一个新的实例File从中读取指定抽象。Activator.CreateInstance()指定参数匹配程度最高的构造函数创建指定类型的实例。
2.File.WriteBlock()
public void WriteBlock (ByteVector data) { if (data == null) throw new ArgumentNullException ("data"); Mode = AccessMode.Write; file_stream.Write (data.Data, 0, data.Count); }
该方法将一个数据块写入该代表的文件当前实例在当前查找位置,参数data一个ByteVector包含数据的对象写入当前实例。AccessMode是一个枚举类型,指定当前文件访问操作的类型允许在File的实例上。file_stream.Write (data.Data, 0, data.Count)向当前流中写入字节序列,并将此流中的当前位置提升写入的字节数。
- 开源的.NET媒体文件操作组件TagLib#解析
- 字节流操作媒体文件
- 一款开源免费的.NET文档操作组件——DocX
- .Net 与Com组件的互操作
- 微信组件:媒体文件上传下载
- .NET组件和COM组件之间的相互操作
- NET组件和COM组件之间的相互操作
- .NET组件和COM组件之间的相互操作
- .NET组件和COM组件之间的相互操作
- .NET组件和COM组件之间的相互操作
- 播放媒体文件_ASP.NET播放视频文件,开源代码
- .net的广告组件开源
- Java中 分页组件Pager-taglib的使用
- 关于分页组件pager-taglib的一些代码分享
- java开源的html操作组件
- extremeTable,又一个开源taglib
- 跨平台的.NET邮件协议MailKit组件解析
- .NET调用NPOI组件导入导出Excel的操作类
- 大家好才是真的好
- java I/O系统(2)-装饰器模式
- vs下查看汇编代码
- html基础
- C语言进阶之N种方法实现两个数的交换
- 开源的.NET媒体文件操作组件TagLib#解析
- LINUX系统学习——安装与概要
- iOS使用真机调试时将手机的(UDID)手机唯一标识符备份到开发者网站
- 在自己电脑上安装linux虚拟机,并安装apache2+php5.6+mysql5环境
- 欢迎使用CSDN-markdown编辑器
- ReentrantLock源码分析与理解
- 最佳运动员配对问题-婚姻搭配-最小重量机器设计问题-回溯法
- Java中的不可变类
- 手机游戏优化方向概要