比特率 和 碼率 概覽
比特率和碼率關(guān)系著視頻的清晰程度福稳,幀數(shù)關(guān)系這視頻的流暢度。一般采用25幀即為mp4標(biāo)準(zhǔn)馁痴,幀率越低視頻連貫性越差嚷硫,相反幀率和比特率等越大視頻質(zhì)量越好,但是容量也越大症革。
比特率
AVVideoAverageBitRateKey:
比特率是指每秒傳送的比特(bit)數(shù)筐咧。單位為 bps(Bit Per Second),比特率越高噪矛,傳送數(shù)據(jù)速度越快量蕊。聲音中的比特率是指將模擬聲音信號(hào)轉(zhuǎn)換成數(shù)字聲音信號(hào)后,單位時(shí)間內(nèi)的二進(jìn)制數(shù)據(jù)量艇挨,是間接衡量音頻質(zhì)量的一個(gè)指標(biāo)残炮。 視頻中的比特率(碼率)原理與聲音中的相同,都是指由模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)后缩滨,單位時(shí)間內(nèi)的二進(jìn)制數(shù)據(jù)量势就。
幀數(shù)
AVVideoExpectedSourceFrameRateKey :
AVVideoMaxKeyFrameIntervalKey:
幀數(shù)就是在1秒鐘時(shí)間里傳輸?shù)膱D片的量,也可以理解為圖形處理器每秒鐘能夠刷新幾次脉漏,通常用fps(Frames Per Second)表示苞冯。每一幀都是靜止的圖象,快速連續(xù)地顯示幀便形成了運(yùn)動(dòng)的假象侧巨。高的幀率可以得到更流暢舅锄、更逼真的動(dòng)畫。幀數(shù) (fps) 越高司忱,所顯示的動(dòng)作就會(huì)越流暢皇忿。 但是文件大小會(huì)變大。
各項(xiàng)參數(shù)(參考)
視頻采集幀率:25
視頻編碼碼率:150000
視頻編碼器類型:AVC/H.264編碼
視頻采集編碼的分辨率:低清 (352x288)標(biāo)清 (480x340)高清 (640x480)超清 (960x540)超高清 (1280x720)
攝像頭收視響應(yīng)變焦功能
編碼類型:硬件編碼坦仍,軟件編碼
音頻采集的幀率:2048
音頻編碼碼率:64000
音頻采樣率:44100
采集編碼聲道:單聲道鳍烁,雙聲道
音頻的編碼器類型:AAC/GIPS
推流協(xié)議:RTP,RTMP,RTSP
貼出項(xiàng)目中部分錄制視頻 參數(shù)
AVAssetWriter
//設(shè)置寫入視頻屬性
- (void)setUpWriter
{
self.assetWriter = [AVAssetWriter assetWriterWithURL:self.videoUrl fileType:AVFileTypeMPEG4 error:nil];
//寫入視頻大小
NSInteger numPixels = 1280 * 720;
//每像素比特
CGFloat bitsPerPixel = 6.0;
NSInteger bitsPerSecond = numPixels * bitsPerPixel;
// 碼率和幀率設(shè)置
NSDictionary *compressionProperties = @{ AVVideoAverageBitRateKey : @(bitsPerSecond),
AVVideoExpectedSourceFrameRateKey : @(30),
AVVideoMaxKeyFrameIntervalKey : @(30),
AVVideoProfileLevelKey : AVVideoProfileLevelH264BaselineAutoLevel };
//視頻屬性
self.videoCompressionSettings = @{ AVVideoCodecKey : AVVideoCodecH264,
AVVideoScalingModeKey : AVVideoScalingModeResizeAspectFill,
AVVideoWidthKey : @(self.outputSize.height*2),
AVVideoHeightKey : @(self.outputSize.width*2),
AVVideoCompressionPropertiesKey : compressionProperties };
//初始化視頻寫入類
_assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:self.videoCompressionSettings];
//expectsMediaDataInRealTime 必須設(shè)為yes,需要從capture session 實(shí)時(shí)獲取數(shù)據(jù)
_assetWriterVideoInput.expectsMediaDataInRealTime = YES;
_assetWriterVideoInput.transform = CGAffineTransformMakeRotation(M_PI / 2.0);
// 音頻設(shè)置
//音頻的一些配置包括音頻各種這里為AAC,音頻通道繁扎、采樣率和音頻的比特率
self.audioCompressionSettings = @{ AVEncoderBitRatePerChannelKey : @(28000),
AVFormatIDKey : @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey : @(1),
AVSampleRateKey : @(22050) };
//初始化音頻寫入類
_assetWriterAudioInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeAudio outputSettings:self.audioCompressionSettings];
//表明輸入是否應(yīng)該調(diào)整其處理為實(shí)時(shí)數(shù)據(jù)源的數(shù)據(jù)
_assetWriterAudioInput.expectsMediaDataInRealTime = YES;
//將視頻輸入源加入
if ([_assetWriter canAddInput:_assetWriterVideoInput]) {
[_assetWriter addInput:_assetWriterVideoInput];
}else {
NSLog(@"AssetWriter videoInput 寫入失敗");
}
//將音頻輸入源加入
if ([_assetWriter canAddInput:_assetWriterAudioInput]) {
[_assetWriter addInput:_assetWriterAudioInput];
}else {
NSLog(@"AssetWriter audioInput 寫入失敗");
}
self.writeState = FMRecordStateRecording;
}
硬解碼和軟解碼
由于高清視頻的分辨率遠(yuǎn)遠(yuǎn)高于一般格式視頻幔荒,使得高清視頻的碼率非常高。
再加上VC-1和H.264編碼的壓縮率很高锻离,解碼運(yùn)算的運(yùn)算量很大铺峭。
因此常規(guī)地直接用CPU解碼(即常說的“軟解”)會(huì)極大地消耗CPU的運(yùn)算能力,一些較老的CPU軟解H.264時(shí)CPU占用率往往高達(dá)90%以上汽纠,更老的可能就放不動(dòng)了卫键。
“硬解”是硬件解碼的簡稱。
簡單而言虱朵,硬件解碼就是通過顯卡的視頻加速功能對(duì)高清視頻進(jìn)行解碼莉炉。
因此硬解能夠?qū)PU從繁重的視頻解碼運(yùn)算中釋放出來钓账,使電腦具備流暢播放高清視頻的能力。
顯卡的GPU/VPU要比CPU更適合這類大數(shù)據(jù)量的絮宁、低難度的重復(fù)工作梆暮。
視頻解碼工作從處理器那里分離出來,交給顯卡去做绍昂,這就叫做“硬解碼”啦粹,例如NVIDIA的PureVideo、AMD的UVD技術(shù)等等窘游。
與之對(duì)應(yīng)的唠椭,以前那種純粹依靠CPU來的方式則是“軟解碼”。不過受到技術(shù)條件的限制忍饰,純粹的“硬解碼”在現(xiàn)階段是不存在的贪嫂,CPU依然在發(fā)揮一部分作用,只不過硬解碼時(shí)GPU/VPU已經(jīng)成為運(yùn)算的主力艾蓝。