有兩種方法來實現這一目標。
- 您上傳的視頻文件直接到您的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 –