QML 錄像及預覽的實現(xiàn)

? ? ? ? 在使用QML做移動端開發(fā)時狮含,我們總是會接觸到多媒體的開發(fā)剩晴,尤其在當下這個流媒體時代晶乔,拍小視頻已經(jīng)成為了一種風尚珍坊,記錄每個的生活軌跡,四季變化正罢。

? ? ? ? ?這里通過QML實現(xiàn)簡單的錄像預覽阵漏,錄像界面如下:


? ? ? ? 左邊顯示錄像和錄像的時間,右邊功能控制區(qū)域翻具,單擊開始時開始計時履怯,開始按鈕變成結(jié)束,單擊結(jié)束時界面如下:


? ? ? ? ?進入視頻預覽裆泳,右邊功能區(qū)叹洲,單擊丟棄則進入視頻初始頁面,單擊使用則根據(jù)個人需求做相應處理工禾,功能基本如上运提,接下來開始著手實現(xiàn),這里列舉其中用的知識點:

1闻葵,Camera 的錄像的實現(xiàn)

2, Timer的計時

3民泵,MediaPlayer的視頻預覽

? ? ? ? 因為移動端的空間有限,在視頻拍攝時都會進行一些時間的限制槽畔,防止大視頻上傳服務器失敗等種種原因栈妆,常見的微信短視頻等一些終端應用都是如此。

? ? ? ? 首先我們在QtCreator中創(chuàng)建一個項目選擇支持終端和PC的application 厢钧,在Pro中添加multimedia 重新編譯鳞尔,在生成的Qml頁面類導入QtMultimedia 相應的版本 生聲明需要的變量

property bool isCameraAvailable:QtMultimedia.availableCameras.length>0//判斷當前相機是否可用

property bool isStart:false;//是否開始錄像

property bool isRecord:false;//是否開始記錄

property bool isLoop:true;//是否循環(huán)預覽視頻

property string videoName:"/mnt/sdcard/Download/vd"http://視頻錄完后保存的名字

Rectangle{

? ? ? ? anchors.fill:parent

? ? ? ? visible:true

//錄像的輸出

VideoOutput{

? ? ? anchors.fill:parent

? ? ? visible:!isRecord

? ? ? source:_mCamera;

}

Camera{

? ? id:_mCamera

? ? captureMode:Camera.CaptureVideo//設置錄像模式

? ? flash.mode:Camera.FlashRedEyeReduction

? ? position:Camera.BackFace//設置采用后置攝像頭錄像

? ? focus.focusMode:Camera.FocusAuto //自動獲取焦點

? ? focus.focusPointMode:Camera.FocusPointCenter

? ?videoRecorder.audioEncodingMode:CameraRecorder.ConstantBitrateEncoding;

? ?videoRecorder.audioBitRate:128000 //設置視頻比特率為128000

? ?videoRecorder.mediaContainer:"mp4"http://視頻錄取格式為MP4

? ?videoRecorder.outputLocation:videoName // 視頻保存地址

? exposure{

? ? ? exposureCompensation:-1.0

? ? ? exposureMode:Camera.ExposurePortrait

? }?

videoRecorder{

? ? ? ? ?onRecorderStateChanged:{//錄像狀態(tài)變化的監(jiān)聽

? ? ? ? ? ? ? ? console.log("onRecorderStateChanged:"+videoRecorder.recorderState);

? }

? ? onDurationChanged:{//獲取錄像的時長(毫秒)

? ? ? ?tmParse(parseInt(duration/1000));

? }

}

}

MediaPlayer{

? ? ? id:_mPlayer

? ? ? onStopped:{//需求是循環(huán)播放錄像

? ? ? console.log("playvideostop:")

? ? ? ? if(isLoop){

? ??????????????_mPlayer.play();

????????}

?}

}

//視頻播放的輸出,錄像時隱藏視頻播放的輸出

VideoOutput{

? ? ?id:_mPlayerOutput

? ? anchors.fill:parent

? ? visible:isRecord

}

//右邊功能控制欄

Column{

? ? anchors.right:parent.right

? ? spacing:16

? ? visible:isCameraAvailable

? ? anchors.verticalCenter:parent.verticalCenter

? ? anchors.rightMargin:18

? Rectangle{

? ? ? ?width:72;height:72;radius:width/2

? ? ? ?color:"gray"

? ? ? visible:isRecord

Text{

? ? ?text:"丟棄"

? ? ?anchors.fill:parent

? ? ?horizontalAlignment:Text.AlignHCenter;

? ? ?verticalAlignment:Text.AlignVCenter

? ? ?font.pixelSize:height*0.3

? ? ?color:"white"

}

MouseArea{

? ? ? ?anchors.fill:parent

? ? ? onClicked:{

? ? ? ? ? ? isRecord=false;

? ? ? ? ? ? isLoop=false;

? ??????????_mPlayer.stop();

? ? ? }

?}

}

Rectangle{

? ? ?width:72;height:72;radius:width/2

? ? ?color:"gray";visible:!isRecord

Text{

? ? ? id:_control

? ? ? text:"開始";anchors.fill:parent

? ? ? horizontalAlignment:Text.AlignHCenter;verticalAlignment:Text.AlignVCenter

? ? ? font.pixelSize:height*0.3;color:"white"

}

MouseArea{

? ? ? anchors.fill:parent

? ? ?onClicked:{

? ? ? ? ? if(!isStart){

? ? ? ? ? ? ? console.log("getvideoname:"+videoName)

? ? ? ? ? ? ? isStart=true;

? ? ? ? ? ? ? _control.text="結(jié)束"

? ? ? ? ? ? ? isRecord=false

? ? ? ? ? ? ? _mPlayerOutput.source=_mPlayer

? ? ? ? ? ? ?_mCamera.videoRecorder.record()

? ? ? ? ? ? ?countDown.start();

? ? ? ? ? ? console.log("clickisrecordvideo...")

? ? }else{

? ? ? ? ? ? isStart=false;

? ? ? ? ? ? _control.text="開始"

? ? ? ? ? ? isRecord=true

? ? ? ? ? ? _mCamera.videoRecorder.stop()

? ? ? ? ? ? _mPlayer.source="file://"+videoName+".mp4"

? ? ? ? ? ?_mPlayer.play()

? ? ? }

? }

?}

}

Rectangle{

? ? ? ? ? ?width:72;height:72;radius:width/2

? ? ? ? ? color:"gray";visible:isRecord

Text{

? ? ? ? ?text:"使用"

? ? ? ? anchors.fill:parent

? ? ? horizontalAlignment:Text.AlignHCenter;

? ? ? verticalAlignment:Text.AlignVCenter

? ? ? font.pixelSize:height*0.3;color:"white"

?}

MouseArea{

? ? ?anchors.fill:parent

? ? ?onClicked:{

? ? ? ? ?//單擊使用時根據(jù)自己的需求做相應的處理

? ? ? ? ?}

? ? }

?}

}

//當前錄像的時間

Rectangle{

? ? ? ? ?width:160;height:160;radius:80;visible:isStart

? ? ? ? ?anchors.horizontalCenter:parent.horizontalCenter

? ? ? ? ?color:"#30ffffff"

? ? ? ? ?Text{

? ? ? ? ? ? ? ? ?id:videoTime

? ? ? ? ? ? ? ? anchors.centerIn:parent

? ? ?}

}

Text{

? ? ? anchors.centerIn:parent;text:"設備不可用"

? ? ?color:"whitesmoke";font.pixelSize:24

? ? ? visible:!isCameraAvailable

? }

}

//把毫秒轉(zhuǎn)換成分秒個格式進行顯示

functiontmParse(duration){

? ? ? ? console.log("getcurrentduration:"+duration)

? ? ? ?var min=parseInt(duration/60)

? ? ? ?var sec=duration%60

? ? ? if(sec<10){

? ? ? ? ? ? sec="0"+sec

? ? ?}

? ? ?if(min<10){

? ? ? ? ? ?min="0"+min

? ? ?}

? ? ?console.log("getmin:"+min+":"+sec)

? ? ?videoTime.text="00:"+min+":"+sec;

}

Timer{

? ??id:countDown

? ? interval:10000;

? ? running:true;

? ? repeat:true;

? ? onTriggered:{

? ? ?_mCamera.videoRecorder.stop();

? }

}

如上為簡單的錄像實現(xiàn)早直,在定時錄像時開始在onDuration根據(jù)當前錄像毫秒數(shù)進行定時結(jié)束錄像铅檩,發(fā)現(xiàn)方法無法執(zhí)行,于是添加Timer進行定時到了指定時間變停止錄像莽鸿。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昧旨,一起剝皮案震驚了整個濱河市拾给,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兔沃,老刑警劉巖蒋得,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乒疏,居然都是意外死亡额衙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門怕吴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窍侧,“玉大人,你說我怎么就攤上這事转绷∥凹” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵议经,是天一觀的道長斧账。 經(jīng)常有香客問我,道長煞肾,這世上最難降的妖魔是什么咧织? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮籍救,結(jié)果婚禮上习绢,老公的妹妹穿的比我還像新娘。我一直安慰自己蝙昙,他們只是感情好毯炮,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耸黑,像睡著了一般桃煎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上大刊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天为迈,我揣著相機與錄音,去河邊找鬼缺菌。 笑死葫辐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伴郁。 我是一名探鬼主播耿战,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焊傅!你這毒婦竟也來了剂陡?” 一聲冷哼從身側(cè)響起狈涮,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸭栖,沒想到半個月后歌馍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡晕鹊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年松却,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溅话。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡晓锻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出飞几,到底是詐尸還是另有隱情砚哆,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布循狰,位于F島的核電站窟社,受9級特大地震影響券勺,放射性物質(zhì)發(fā)生泄漏绪钥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一关炼、第九天 我趴在偏房一處隱蔽的房頂上張望程腹。 院中可真熱鬧,春花似錦儒拂、人聲如沸寸潦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽见转。三九已至,卻和暖如春蒜哀,著一層夾襖步出監(jiān)牢的瞬間斩箫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工撵儿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乘客,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓淀歇,卻偏偏與公主長得像易核,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浪默,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 各種純css圖標 CSS3可以實現(xiàn)很多漂亮的圖形牡直,我收集了32種圖形缀匕,在下面列出。直接用CSS3畫出這些圖形井氢,要比...
    劍殘閱讀 9,506評論 0 8
  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點 崗位名...
    lilyping閱讀 1,842評論 0 1
  • 在學習weex的過程中看到了常用標簽相關的內(nèi)容弦追,為了自己以后能夠快速查閱特整理出此文檔。 a 簡介組件定義了指向某...
    TyroneTang閱讀 4,649評論 1 3
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程花竞,因...
    小菜c閱讀 6,365評論 0 17
  • 本文詳細介紹了Android布局中Layout_weight的屬性劲件,它是用來分配屬于空間的一個屬性,你可以設置他的...
    插兜閱讀 802評論 2 7