有两种方法来实现这一目标。
- 您上传的视频文件直接到您的DB(你需要在你的数据库的视频表中的
BLOB
场)
- 您保存在文件系统中的视频文件和路径的文件存储在数据库中(首选)。
为什么我更喜欢第二种方法?
数据库旨在非常快速地处理小物体。另一方面,数据库内的较大对象随着时间的推移而降低,访问速度受到影响。第二种方法也比较简单,但我们先来看看。
编码:
private void Encode()
{
Job j = new Job();
MediaItem m = new MediaItem(txtBxVideoFilePath.Text);
Source s = m.Sources[0];
s.Clips[0].StartTime = new TimeSpan(0, 0, 5);
s.Clips[0].EndTime = new TimeSpan(0, 0, 10);
j.OutputDirectory= @"C:\Users\MyOutputDir\";
j.MediaItems.Add(m);
j.Encode();
txtBxOutputDir.Text = j.ActualOutputDirectory; //Path to your videofile
}
编码后,你会得到你的Job
的ActualOutputDirectory
您可以访问,然后让你的编码的视频文件,或者将它们保存在其他地方(第二种方法的目录串)或将它们保存为您的数据库中的BLOB
。
存储为(LONG)BLOB
(在我的情况下,我用MySQL
作为我的DBMS,但其他DBMS应该不会太不同):
创建表:
CREATE TABLE `video` (
`VideoID` int(11) NOT NULL,
`VideoName` varchar(255) NOT NULL,
`VideoSize` int(11) NOT NULL,
`VideoFile` longblob NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
当然还有很多缺如索引,主键,但与获得整体想法无关。
要将文件存储在您的数据库中,您必须将其读取为BLOB兼容对象,该对象是一个字节数组(byte[]
)。
byte[] video = File.ReadAllBytes(filepath);
您可以通过迭代得到的文件路径ActualOutputDirectory
:
foreach (string filepath in Directory.GetFiles(ActualOutputDirectory))
{
StoreBLOBInDB(filepath);
}
将您的视频文件转换成数据库的代码可能是这样的:
MySqlCommand command = new MySqlCommand("", connection);
command.CommandText = "INSERT INTO video (VideoName, VideoSize, VideoFile) VALUES (?videoname, ?videosize, ?videofile);";
byte[] video = File.ReadAllBytes(filepath);
MySqlParameter pVideoName= new MySqlParameter("?videoname", MySqlDbType.VarChar);
pVideoName.Value = Path.GetFileName(filepath);
MySqlParameter pVideoSize = new MySqlParameter("?videosize", MySqlDbType.Int32);
pVideoSize.Value = video.Length;
MySqlParameter pVideoBlob= new MySqlParameter("?videofile", MySqlDbType.Blob, video.Length);
pVideoBlob.Value = video;
command.Parameters.Add(pVideoName);
command.Parameters.Add(pVideoSize);
command.Parameters.Add(pVideoBlob);
command.ExecuteNonQuery();
打开/关闭的连接:
string myConnectionString = "SERVER=localhost;" +
"DATABASE=encodingdb;" +
"UID=encoder;" +
"PASSWORD=encoder;";
this.connection = new MySqlConnection(myConnectionString);
this.connection.Open();
this.connection.Close();
检索BLOB文件也很容易:
MySqlCommand command = new MySqlCommand("", connection);
command.CommandText = "SELECT VideoName, VideoSize, VideoFile FROM video WHERE VideoName=?videoname;";
MySqlParameter pVideoname = new MySqlParameter("?videoname", MySqlDbType.VarChar);
pVideoname.Value = Path.GetFileName(videoName);
command.Parameters.Add(pVideoname);
MySqlDataReader videofileReader;
videofileReader = command.ExecuteReader();
byte[] videoBlob = new byte[0];
while (videofileReader.Read())
{
int videoSize = videofileReader.GetInt32("VideoSize");
videoBlob = new byte[videoSize];
videofileReader.GetBytes(videofileReader.GetOrdinal("VideoFile"), 0, videoBlob, 0, videoSize);
}
File.WriteAllBytes(@"C:\Encoding\export.wmv", videoBlob);
videofileReader.Close();
CloseConnection();
谢谢你的时间!这正是我想要的,祝你有美好的一天。 – Fearcoder
不客气,祝你有美好的一天。快乐编码:-) – jAC
在MSSQL中,您可以使用FileStreams来保存Blob数据。通过将文件系统上的varbinary(max)二进制大对象(BLOB)数据存储为文件,FILESTREAM将SQL Server数据库引擎与NTFS文件系统集成在一起。在这里查看更多详情https://technet.microsoft.com/zh-cn/library/bb933993(v=sql.105).aspx –