關(guān)的多個視頻,此時終端可以通過本發(fā) 明實(shí)施例提供的方法將這多個視頻合并為一個視頻。
[0059] 參見圖2,該方法具體包括:
[0060] 步驟201 :創(chuàng)建第一線程、第二線程和第三線程,通過第一線程、第二線程和第三 線程拍攝第一視頻和第二視頻;
[0061] 其中,終纟而上配直有攝像頭和麥克風(fēng),可以通過攝像頭來拍攝視頻數(shù)據(jù),通過麥克 風(fēng)來采集音頻數(shù)據(jù)。且為了在拍攝視頻數(shù)據(jù)的同時采集音頻數(shù)據(jù),可以通過多線程技術(shù)創(chuàng) 建多個線程,通過一個線程獲取攝像頭拍攝的視頻數(shù)據(jù),同時通過另一個線程來獲取麥克 風(fēng)采集的音頻數(shù)據(jù)。
[0062] 本步驟具體為,通過多線程技術(shù)創(chuàng)建第一線程、第二線程和第三線程。通過第一線 程獲取攝像頭當(dāng)前拍攝的一幀視頻數(shù)據(jù),將攝像頭當(dāng)前拍攝的一幀視頻數(shù)據(jù)插入到視頻隊(duì) 列的隊(duì)尾。通過第二線程獲取麥克風(fēng)當(dāng)前采集的一幀音頻數(shù)據(jù),將麥克風(fēng)當(dāng)前采集的一幀 音頻數(shù)據(jù)插入到音頻隊(duì)列的隊(duì)尾。通過第三線程,從視頻隊(duì)列的隊(duì)首獲取一幀視頻數(shù)據(jù)以 及從音頻隊(duì)列的隊(duì)首獲取一幀音頻數(shù)據(jù),將獲取的一幀視頻數(shù)據(jù)和一幀音頻數(shù)據(jù)組合為第 一視頻中的一幀視頻。對于第一視頻中的其他每幀視頻,都可以按照上述操作獲取第一視 頻中的其他每幀視頻。同樣,也可以按照上述方法獲取第二視頻中的每幀視頻。
[0063] 其中,視頻隊(duì)列和音頻隊(duì)列均為先進(jìn)先出隊(duì)列。由于第三線程的處理速度比第一 線程和第二線程的處理速度慢很多,所以需要將第一線程獲取的視頻數(shù)據(jù)插入到視頻隊(duì)列 的隊(duì)尾進(jìn)行等待,以及需要將第二線程獲取的音頻數(shù)據(jù)插入到音頻隊(duì)列的隊(duì)尾進(jìn)行等待。 [0064] 例如,通過多線程技術(shù)創(chuàng)建第一線程tl、第二線程t2和第三線程t3。通過第一線 程tl獲取攝像頭當(dāng)前拍攝的一幀視頻數(shù)據(jù)v3,將攝像頭當(dāng)前拍攝的一幀視頻數(shù)據(jù)v3插入 到如隊(duì)列1所示的視頻隊(duì)列的隊(duì)尾。通過第二線程t2獲取麥克風(fēng)當(dāng)前采集的一幀音頻數(shù) 據(jù)r3,將麥克風(fēng)當(dāng)前采集的一幀音頻數(shù)據(jù)r3插入到如隊(duì)列2所示的音頻隊(duì)列的隊(duì)尾。通過 第三線程t3,從如隊(duì)列1的視頻隊(duì)列的隊(duì)首獲取一幀視頻數(shù)據(jù)vl以及從如隊(duì)列2所示的音 頻隊(duì)列的隊(duì)首獲取一幀音頻數(shù)據(jù)rl,將獲取的一幀視頻數(shù)據(jù)vl和一幀音頻數(shù)據(jù)rl組合為 第一視頻videol中的一幀視頻。對于第一視頻videol中的其他每幀視頻,都可以按照上 述操作獲取第一視頻中的其他每幀視頻。同樣,也可以按照上述方法獲取第二視頻vide〇2 中的每幀視頻。
[0069] 其中,通過多線程技術(shù)來拍攝視頻,在通過攝像頭拍攝視頻數(shù)據(jù)的同時,可以通過 麥克風(fēng)采集音頻數(shù)據(jù),以及將同一時間獲取的一幀視頻數(shù)據(jù)和一幀音頻數(shù)據(jù)組合為視頻中 的一幀視頻,如此可以縮短獲取視頻的時間,提1?獲取視頻的效率。
[0070] 進(jìn)一步地,第一視頻和第二視頻也可以不是終端拍攝的視頻。第一視頻和第二視 頻可以為終端上已存儲的視頻或終端從視頻服務(wù)器獲取的視頻。但是第一視頻和第二視頻 的視頻格式必須相同。視頻格式可以為AVI(AudioVideoInteractive,音頻和視頻混合編 碼)、WMV(WindowsMediaVideo,數(shù)位視頻編解碼格式)或DV(DigitalVideo,數(shù)字視頻) 等。
[0071] 其中,函數(shù)av_read_frame()為音視頻讀取函數(shù),用于讀取視頻中包括的每幀視 頻的數(shù)據(jù)。通過上述操作獲取到第一視頻和第二視頻之后,可以通過函數(shù)aV_read_frame () 來分別讀取第一視頻中包括的每幀視頻的數(shù)據(jù)和第二視頻中包括的每幀視頻的數(shù)據(jù)。
[0072] 其中,通過上述步驟201的操作獲取到第一視頻和第二視頻之后,可以通過如下 步驟202-205的操作來將第一視頻和第二視頻合并為一個視頻。
[0073]步驟202:獲取幀間隔時間;
[0074] 其中,幀間隔時間為視頻中相鄰兩幀視頻之間間隔的時間。
[0075] 本步驟具體為,獲取第一視頻中每幀視頻所占用的時間、第一視頻包括的視頻幀 的數(shù)目以及第一視頻的總時長。計(jì)算每幀視頻所占用的時間的總和得到第一視頻中所有視 頻幀所占用的時間。計(jì)算第一視頻的總時長與所有視頻幀所占用的時間的差值得到第一視 頻中的總幀間隔時間。根據(jù)第一視頻包括的視頻幀的數(shù)目確定第一視頻中幀間隔的個數(shù)。 計(jì)算總幀間隔時間與幀間隔的個數(shù)的比值得到幀間隔時間。
[0076] 其中,一幀視頻的數(shù)據(jù)中包括該幀視頻所占的時間,且一般視頻中包括的每幀視 頻所占用的時間均相等,可以從第一視頻中每幀視頻的數(shù)據(jù)中分別獲取每幀視頻所占用的 時間。
[0077] 例如,假設(shè)第一視頻videol的總時長為Is,第一視頻videol中包括20幀視頻,每 幀視頻占用的時間相等且均為〇. 〇4s。獲取第一視頻videol中每幀視頻所占用的時間均為 0. 04s、第一視頻videol包括的視頻幀的數(shù)目20以及第一視頻videol的總時長Is。計(jì)算 每幀視頻所占用的時間的總和為〇. 8s,得到第一視頻videol中所有視頻幀所占用的時間 為0. 8s。計(jì)算第一視頻videol的總時長Is與所有視頻幀所占用的時間0. 8s的差值得到 第一視頻videol中的總幀間隔時間為0.2s。根據(jù)第一視頻videol包括的視頻幀的數(shù)目 20確定出第一視頻videol中幀間隔的個數(shù)為19。計(jì)算總幀間隔時間0. 2s與幀間隔的個 數(shù)19的比值得到幀間隔時間為0. 01s。
[0078] 進(jìn)一步地,還可以事先設(shè)置一個預(yù)設(shè)的幀間隔時間。
[0079] 步驟203 :根據(jù)該幀間隔時間和第一視頻中包括的第一幀視頻的顯示時間以及最 后一幀視頻的顯示時間,獲取時間偏移量;
[0080] 其中,一幀視頻中包括該幀視頻的顯示時間。在播放視頻時,在該幀視頻的顯示時 間播放該幀視頻。在獲取第一視頻中包括的每幀視頻的數(shù)據(jù)時可以獲取到第一幀視頻的顯 示時間以及最后一幀視頻的顯示時間。
[0081] 本步驟具體為,根據(jù)該幀間隔時間和第一視頻中包括的第一幀視頻的顯示時間以 及最后一幀視頻的顯示時間,按如下所示的公式(1)計(jì)算時間偏移量;
[0082] T=PTSirPTS^tO......(1)
[0083]在公式⑴中,T為時間偏移量,PTSn為最后一幀視頻的顯不時間,PTS1為第一中貞 視頻的顯示時間,to為幀間隔時間。
[0084] 例如,假設(shè)第一視頻videol中包括的第一幀視頻的顯示時間為0:00,最后一幀的 顯示時間為0:01。根據(jù)幀間隔時間〇.OlS和第一視頻Videol中包括的第一幀視頻的顯示 時間〇:〇〇以及最后一幀視頻的顯示時間0:01,按如下所示的公式(2)計(jì)算出時間偏移量為 LOls0
[0085] T=PTSn-PTS1^O= 0:01-0:00+0. 01 =I. 01 ......(2)
[0086] 其中,通過上述步驟202和203的步驟獲取到時間偏移量之后,通過下述步驟204 的操作來計(jì)算第二視頻中包括的每幀視頻在合并后的視頻中的顯示時間和解碼時間。
[0087] 步驟204 :根據(jù)時間偏移量、第二視頻中包括的每幀視頻的顯示時間和解碼時間, 計(jì)算第二視頻中包括的每幀視頻在合并后的視頻中的顯示時間和解碼時間;
[0088] 其中,一幀視頻中包括該幀視頻的顯示時間和解碼時間。在播放視頻時,在該幀視 頻的解碼時間對該幀視頻的數(shù)據(jù)進(jìn)行解碼,然后在該幀視頻的顯示時間播放該幀視頻。在 獲取第二視頻中包括的每幀視頻的數(shù)據(jù)時可以獲取到第二視頻中包括的每幀視頻的顯示 時間和解碼時間。
[0089] 本步驟具體為,根據(jù)第二視頻中包括的每幀視頻的顯示時間和時間偏移量,按如 下公式(3)計(jì)算第二視頻中包括的每幀視頻在合并后的視頻中的顯示時間。
[0090] PTS/ =PTSi+!......(3)
[0091] 在公式(3)中,PTSi為第二視頻中包括的第i幀視頻的顯示時間,PTS/為第二視 頻中包括的第i幀視頻在合并后的視頻中的顯示時間。
[0092] 根據(jù)第二視頻中包括的每幀視頻的解碼時間和時間偏移量,按如下公式(4)計(jì)算 第二視頻中包括的每幀視頻在合并后的視頻中的解碼時間。
[0093] DTS/ =DTSi+!......(4)
[0094] 在公式⑷中,DTSi為第二視頻中包括的第i幀視頻的解碼時間,DTS/為第二視 頻中包括的第i幀視頻在合并后的視頻中的解碼時間。
[0095] 例如,假設(shè)第二視頻video2中包括3幀視頻,第一幀視頻的顯示時間為0:00以及 解碼時間為〇: 〇〇,第二幀視頻的顯示時間為〇: 〇 1以及解碼時間為〇: 〇〇,第三幀視頻的顯示 時間為0:02以及解碼時間為0:01。根據(jù)第二視頻vide〇2中包括的第一幀視頻的顯示時間 0:00和時間偏移量I. 01,按如下公式(5)計(jì)算第二視頻video2中包括的第一幀視頻在合 并后的視頻中的顯示時間為1:01。同樣按照上述方法計(jì)算出第二幀視頻在合并后的視頻中 的顯示時間為1:02,以及第三幀視頻在合并后的視頻中的顯示時間為1:03。
[0096] PTS/ =PTS1+! = 0:00+1. 01 = 1:01 ......(5)
[0097] 根據(jù)第二視頻video2中包括的第一幀視頻的解碼時間0:00和時間偏移量1. 01, 按如下公式(6)計(jì)算第二視頻video2中包括的第一幀視頻在合并后的視頻中的解碼時間 為1:01。同樣按照上述方法計(jì)算出第二幀視頻在合并后的視頻中的解碼時間為1:01,以及 第三幀視頻在合并后的視頻中的解碼時間為1:02。
[0098] DTS/ =DTSi+! = 0:00+1. 01 = 1:01 ......(6)
[0099] 其中,通過上述步驟204的操作計(jì)算出第二視頻中包括的每幀視頻在合并后的視 頻中的顯示時間和解碼時間之后,通過如下步驟205的操作來合并第一視頻和第二視頻。
[0100] 步驟205 :根據(jù)第二視頻中包括的每幀視頻在合并后的視頻中的顯示時間和解碼 時間,將第一視頻和第二視頻合并為一個視頻。
[0101] 具體地,將第一視頻的每幀視頻存儲在一個視頻文件中,然后根據(jù)第二視頻中包 括的每幀視頻在合并后的視頻中的顯示時間以及解碼時間,確定第二視頻中包括的每幀視 頻