关于码率bitrate,帧率frame rate,分辨率的区别

码率就是数据传输时单位时间传送的数据位数,一般我们用的单位是kbps即千位每秒。通俗一点的理解就是取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来的cbr(固定码率)与vbr(可变码率),都是在这方面做的文章,不过事情总不是绝对的,从音频方面来说,码率越高,被压缩的比例越小,音质损失越小,与音源的音质越接近。“码率”就是失真度,码率越高越清晰,反之则画面粗糙而多马赛克。计算机中的信息都是二进制的0和1来表示,其中每一个0或 1被称作一个位,用小写b表示,即bit(位);大写B表示byte,即字节,一个字节=八个位,即1B=8b;前面的大写K表示千的意思,即千个位(Kb)或千个字节(KB)。表示文件的大小单位,一般都使用字节(KB)来表示文件的大小。
    Kbps:首先要了解的是,ps指的是/s,即每秒。Kbps指的是网络速度,也就是每秒钟传送多少个千位的信息(K表示千位,Kb表示的是多少千个位),为了在直观上显得网络的传输速度较快,一般公司都使用kb(千位)来表示,如果是KBps,则表示每秒传送多少千字节。1KBps=8Kbps。 ADSL上网时的网速是512Kbps,如果转换成字节,就是512/8=64KBps(即64千字节每秒)。 

      帧数简单地说,帧数就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。一般来说30fps是可以接受的,所以要避免动作不流畅的最低fps是30。除了30fps外,有些计算机视频格式,例如 AVI,每秒只能提供15帧。我们之所以能够利用摄像头来看到连续不断的影像,是因为影像传感器不断摄取画面并传输到屏幕上来,当传输速度达到一定的水平时,人眼就无法辨别画面之间的时间间隙,所以大家可以看到连续动态的画面。
        每秒的帧数(fps)或者说帧率表示图形处理器场景时每秒钟能够更新几次。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为显示器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。
       一般用“FPS(frame per second,每秒钟画面更新的数量)”来表示该项指标。在欣赏电视、电影画面时,只要画面的刷新率达到24帧/秒,就能满足人们的需要。同样的,在玩普通的游戏时,如果刷新率达到24帧/秒即可,但在一些高速游戏中(例如射击游戏),如果画面的刷新率还是只有24帧/秒,那么就会感觉到画面比较迟钝,不够流畅。 
  虽然理论上画面的刷新率越快越好,但过高的刷新率并没有实际意义——当画面的FPS达到60帧/秒时,已经能满足绝大部分应用需求。一般情况下,如果能够保证游戏画面的平均FPS能够达到30帧/秒,那么画面已经基本流畅;能够达到50帧/秒,就基本可以体会到行云流水的感觉了。一般人很难分辨出60 帧/秒与100帧/秒有什么不同。

  (2)是什么影响了FPS 
  既然刷新率越快越好,为什么还要强调没必要追求太高的刷新率呢?其中原因是在显示分辨率不变的情况下,FPS越高,则对显卡的处理能力要求越高。

  电脑中所显示的画面,都是由显卡来进行输出的,因此屏幕上每个像素的填充都得由显卡来进行计算、输出。当画面的分辨率是1024×768时,画面的刷新率要达到24帧/秒,那么显卡在一秒钟内需要处理的像素量就达到了“1024×768×24=18874368”。如果要求画面的刷新率达到50 帧/秒,则数据量一下子提升到了“1024×768×50=39321600”。

  FPS与分辨率、显卡处理能力的关系如下:处理能力=分辨率×刷新率。这也就是为什么在玩游戏时,分辨率设置得越大,画面就越不流畅的原因了。
码率影响体积,与体积成正比:码率越大,体积越大;码率越小,体积越小。
帧率影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。
分辨率影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。

看了上面的关系,你会发现,没有提到清晰度的内容,因为清晰度对两个元素有依赖性,需要讨论两种情况的。

首先明确一下“清晰度”的概念:所谓“清晰”,是指画面十分细腻,没有马赛克。并不是分辨率越高图像就越清晰。

简单说:

在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。

但是,事实情况却不是这么简单。

可以这么说:在码率一定的情况下,分辨率在一定范围内取值都将是清晰的;同样地,在分辨率一定的情况下,码率在一定范围内取值都将是清晰的。

先说说马赛克,根据百度百科:
马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克。
我们在视频转换时出现的马赛克是我们不想要的。它的出现是因为码率不够造成的色阶缺失。打个比方(只是比方),源视频相邻10个像素点每个点代表一种颜色,需要10Kbp/s码率,而你只分配了2Kbp/s给它,那么原来的10个颜色就只能留下2个,如果还保持10个像素点的分辨率,那么每就会5个像素点共用一个颜色,出来的效果就是这5个像素点的屏幕区域就一种颜色填充,画面就变得粗糙了。

打个比方,我们给予一个视频 8000 kbp/s 的码率,这算是比较高的码率了,它能保证在720*576分辨率下画面上每个像素点都代表一个独立的色块而非从相邻色块渲染而来。在这种8000 kbp/s码率下,我们说只要分辨率小于720*576,画面就是清晰的,因为画面越小,越不需要借助渲染来增加色块。

反过来说,当分辨率限定为352*288(画面大小为720*576的四分之一),此时3000kbp/s码率就可以保证其每个像素点的独立性,那么只要码率高于3000kbp/s,就
可以保证图像的清晰度。
建议参考“常见视频光盘采用算法、标准分辨率及标准帧率(VCD SVCD KVCD DVD KDVD HDVD)”,看源视频和哪个分辨率相近,就用哪个分辨率,这样可以最小程度地对源视频进行渲染。

如果源视频是高清画质,分辨率特别高,高出DVD规格许多,那么,因为DVD规格的最大分辨率就是720*576,不能设置更高,所以,目标分辨率最高只能保持到720*576。

前面说了,分辨率不决定清晰度,分辨率一定的情况下,码率要高于某个数值才能保持绝对清楚,因此,如果目标码率太低,出现马赛克的情况很正常。

降低分辨率当然可以解决马赛克的问题,但是会丢失大量细节,在大屏幕电视上播放会因为放大渲染而产生颗粒感。但在小电视上看区别不明显。

不出现或少出现马赛克、同时用较高分辨率保留更多画面细节,其直接结果是占用光盘空间巨大,一张光盘刻录不了多少内容。

这里面的矛盾想起来都令人头疼,别人无法帮你做这个决定,只能由你自己权衡利弊,鱼与熊掌不可兼得! 
发布了63 篇原创文章 · 获赞 36 · 访问量 73万+
展开阅读全文

设置asfwriter的profile后录制的asf文件没声音

02-25

调用函数如下: function TMainForm.SetASFWriterProfile(pWriter: TASFWriter; lWidth, lHeight, bitRate: Integer): HRESULT; var hr: HRESULT; pvi: PVideoInfoHeader; pProfile: IWMProfile; pProfileMgr: IWMProfileManager; pStream: IWMStreamConfig; pStream1: IWMStreamConfig; pMediaProps: IWMVideoMediaProps; pMediaType: PWMMediaType; cbMediaType: Cardinal; ConfigAsfWriter: IConfigAsfWriter; begin { hr = m_pWMVEncoder->QueryInterface(IID_IConfigAsfWriter, (void**)&pConfig); hr=LoadCustomProfile("D1.prx",&pProfile ); hr=pProfile->GetStream(1,&pStreamConfig); hr=pStreamConfig->QueryInterface(IID_IWMMediaProps,(void**)&pProps); hr=pProps->GetMediaType(pType,&size); BITMAPINFOHEADER* pBitmap=(BITMAPINFOHEADER*)&pHeader->bmiHeader; pBitmap->biWidth=720; pBitmap->biHeight=576; hr=pProps->SetMediaType(pType); hr=pProfile->ReconfigStream(pStreamConfig); hr=pConfig->ConfigureFilterUsingProfile(pProfile); } hr := WMCreateProfileManager(pProfileMgr); if FAILED(hr) then begin ShowMessage(format('Error on Call WMCreateProfileManager (%x)', [hr])); Result := hr; exit; end; hr := pProfileMgr.CreateEmptyProfile(WMT_VER_7_0, pProfile); if FAILED(hr) then begin ShowMessage(format('Error on Call pProfileMgr.CreateEmptyProfile (%x)', [hr])); Result := hr; exit; end; hr := pProfile.SetName('Video1'); if FAILED(hr) then begin ShowMessage(format('Error on Call pProfile.SetName (%x)', [hr])); Result := hr; exit; end; hr := pProfile.SetDescription('LYSoft WMV ProFiles'); if FAILED(hr) then begin ShowMessage(format('Error on Call pProfile.SetDescription (%x)', [hr])); Result := hr; exit; end; hr := pProfile.CreateNewStream(WMMEDIATYPE_Video, pStream);//WMMEDIATYPE_Video if FAILED(hr) then begin ShowMessage(format('Error on Call pProfile.CreatenewStream (%x)', [hr])); Result := hr; exit; end; // hr := pProfile.CreateNewStream(WMMEDIATYPE_Audio, pStream1);//WMMEDIATYPE_Video // Get the media properties interface for the new stream. hr := pStream.QueryInterface(IID_IWMMediaProps, pMediaProps); //IID_IWMVideoMediaProps if FAILED(hr) then begin ShowMessage(format('Error on Call pStream.QueryInterface (%x)', [hr])); Result := hr; exit; end; // Get the media-type structure. // First, get the size of the media-type structure. hr := pMediaProps.GetMediaType(nil, cbMediaType); if FAILED(hr) then begin ShowMessage(format('Error on Call pMediaProps.GetMediaType (%x)', [hr])); Result := hr; exit; end; // Allocate memory for the structure based on the retrieved size. pMediaType := AllocMem(cbMediatype); // Retrieve the media-type structure. hr := pMediaProps.GetMediaType(pMediaType, cbMediaType); if FAILED(hr) then begin ShowMessage(format('Error on Call pMediaProps.GetMediaType (1) (%x)', [hr])); Result := hr; exit; end; // Change the video size pvi := PVideoInfoHeader(pMediaType.pbFormat); // ShowMessage(format('%d,%d,%d,%d',[pvi.bmiHeader.biWidth,pvi.bmiheader.biHeight,pvi.bmiHeader.biBitCount,pvi.bmiHeader.biSizeImage])); pvi.bmiHeader.biWidth := lWidth; pvi.bmiHeader.biHeight := lHeight; pvi.bmiHeader.biSizeImage := pvi.bmiHeader.biWidth * pvi.bmiHeader.biHeight * pvi.bmiHeader.biBitCount div 8; pvi.rcSource := RECT(0, 0, lWidth, lHeight); pvi.rcTarget := RECT(0, 0, lWidth, lHeight); pvi.dwBitRate := bitRate; pvi.AvgTimePerFrame := Round(10000000 / 15); // PFS = 15 pvi.bmiHeader.biCompression := WMMEDIASUBTYPE_WMV1.D1; pMediaType.subtype := WMMEDIASUBTYPE_WMV1; pMediaProps.SetMaxKeyFrameSpacing(30000000); pMediaProps.SetQuality(100); hr := pMediaProps.SetMediaType(pMediaType); if FAILED(hr) then begin ShowMessage(format('Error on Call pMediaProps.SetMediaType (%x)', [hr])); Result := hr; exit; end; // Release the media properties interface and delete the structure. pMediaProps := nil; FreeMem(pMediaType); pMediaType := nil; hr := pStream.SetBitrate(bitRate); if FAILED(hr) then begin ShowMessage(format('Error on Call pStream.SetBitrate (%x)', [hr])); Result := hr; exit; end; pStream.SetBufferWindow($FFFFFFFF); // Set the stream number. hr := pStream.SetStreamNumber(1); if FAILED(hr) then begin ShowMessage(format('Error on Call pStream.SetStreamNumber (%x)', [hr])); Result := hr; exit; end; // Include the new stream in the profile. hr := pProfile.AddStream(pStream); if FAILED(hr) then begin ShowMessage(format('Error on Call pProfile.AddStream (%x)', [hr])); Result := hr; exit; end; pProfile.ReconfigStream(pStream); pStream := nil; hr := pWriter.QueryInterface(IID_IConfigAsfWriter, ConfigAsfWriter); if FAILED(hr) then begin ShowMessage(format('Error on Call WMCreateProfileManager (%x)', [hr])); Result := hr; exit; end; hr := ConfigAsfWriter.ConfigureFilterUsingProfile(pProfile); if Failed(hr) then begin ShowMessage(format('Error on Call pWriter.ConfigureFilterUsingProfile (%x)', [hr])); Result := hr; exit; end; ConfigAsfWriter := nil; // TODO: Save the custom profile to a string, and save the string to a file. // Release remaining interfaces. pProfile := nil; pProfileMgr := nil; Result := S_OK; end; 请问如何加入音频流呢 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览