WebRTC源码分析4_AVI文件读写

接口路径:
webrtc\trunk\src\modules\media_file\source\avi_file.h
代码模块:media_file
对avi文件的存储方式,可以google了解一下,或参考《AVI文件格式图表描述》点击打开链接
先对webRTC 的avi文件读写使用到几个结构体注释一下:

[cpp]  view plain copy
  1. struct AVISTREAMHEADER  
  2. {  
  3.     AVISTREAMHEADER();  
  4. WebRtc_UWord32 fcc; //4字节,表示数据流的种类 vids 表示视频数据流,RIFF文件结构的块标志,个人觉得不应该放在AVISTREAMHEADER中  
  5. //auds 音频数据流  
  6. //‘txts’(文字流)  
  7.     WebRtc_UWord32 cb;//RIFF文件结构的数据块大小描述,个人觉得不应该放在AVISTREAMHEADER中,long120819  
  8.     WebRtc_UWord32 fccType;//RIFF文件结构的数据块类型描述,个人觉得不应该放在AVISTREAMHEADER中,long120819  
  9. WebRtc_UWord32 fccHandler; //4字节 ,表示数据流解压缩的驱动程序代号  
  10. // 指定流的处理者,对于音视频来说就是解码器  
  11.   
  12.     WebRtc_UWord32 dwFlags; //数据流属性// 标记:是否允许这个流输出?调色板是否变化?  
  13.     WebRtc_UWord16 wPriority; //此数据流的播放优先级//(当有多个相同类型的流时优先级最高的为默认流)  
  14.     WebRtc_UWord16 wLanguage; //音频的语言代号  
  15.     WebRtc_UWord32 dwInitialFrames; //说明在开始播放前需要多少桢// 为交互格式指定初始帧数  
  16.     WebRtc_UWord32 dwScale; //数据量,视频每桢的大小或者音频的采样大小// 这个流使用的时间尺度  
  17.     WebRtc_UWord32 dwRate; //dwScale /dwRate = 每秒的采样数  
  18.     WebRtc_UWord32 dwStart; //数据流开始播放的位置,以dwScale为单位// 流的开始时间  
  19.     WebRtc_UWord32 dwLength; //数据流的数据量,以dwScale为单位// 流的长度(单位与dwScale和dwRate的定义有关)  
  20.     WebRtc_UWord32 dwSuggestedBufferSize; // 读取这个流数据建议使用的缓存大小  
  21.     WebRtc_UWord32 dwQuality; //解压缩质量参数,值越大,质量越好// 流数据的质量指标(0 ~ 10,000)  
  22.     WebRtc_UWord32 dwSampleSize; //音频的采样大小 // Sample的大小  
  23.     struct  
  24.     {  
  25.         WebRtc_Word16 left;  
  26.         WebRtc_Word16 top;  
  27.         WebRtc_Word16 right;  
  28.         WebRtc_Word16 bottom;  
  29.     } rcFrame; //视频图像所占的矩形// 指定这个流(视频流或文字流)在视频主窗口中的显示位置// 视//频主窗口由AVIMAINHEADER结构中的dwWidth和dwHeight决定  
  30. };  
  31.   
  32. struct BITMAPINFOHEADER //参考bmp文件格式描述中的定义  
  33. {  
  34.     BITMAPINFOHEADER();  
  35.     WebRtc_UWord32 biSize;  
  36.     WebRtc_UWord32 biWidth;  
  37.     WebRtc_UWord32 biHeight;  
  38.     WebRtc_UWord16 biPlanes;  
  39.     WebRtc_UWord16 biBitCount;  
  40.     WebRtc_UWord32 biCompression;  
  41.     WebRtc_UWord32 biSizeImage;  
  42.     WebRtc_UWord32 biXPelsPerMeter;  
  43.     WebRtc_UWord32 biYPelsPerMeter;  
  44.     WebRtc_UWord32 biClrUsed;  
  45.     WebRtc_UWord32 biClrImportant;  
  46. };  
  47. struct AVIMAINHEADER  
  48.     {  
  49.         AVIMAINHEADER();  
  50.         WebRtc_UWord32 fcc;//RIFF文件结构的块标志,个人觉得不应该放在AVIMAINHEADER中,下面的cb(块大小)也一样,long120819  
  51.         WebRtc_UWord32 cb;  
  52.         WebRtc_UWord32 dwMicroSecPerFrame; //显示每桢所需的时间ns,定义avi的显示速率  
  53.         WebRtc_UWord32 dwMaxBytesPerSec; // 最大的数据传输率  
  54.         WebRtc_UWord32 dwPaddingGranularity; //记录块的长度需为此值的倍数,通常是2048  
  55.         WebRtc_UWord32 dwFlags; //AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储  
  56.         WebRtc_UWord32 dwTotalFrames; //文件中的总桢数  
  57.         WebRtc_UWord32 dwInitialFrames; //说明在开始播放前需要多少桢 // 为交互格式指定初始帧数(非交互格式应该指定为0)  
  58.         WebRtc_UWord32 dwStreams; //文件中包含的数据流种类// 本文件包含的流的个数  
  59.         WebRtc_UWord32 dwSuggestedBufferSize; //建议使用的缓冲区的大小,  
  60.  //通常为存储一桢图像以及同步声音所需要的数据之和  
  61.         WebRtc_UWord32 dwWidth; //图像宽(以像素为单位)  
  62.         WebRtc_UWord32 dwHeight; //图像高(以像素为单位)  
  63.         WebRtc_UWord32 dwReserved[4]; //保留值  
  64.     };  
  65.   
  66. struct WAVEFORMATEX  
  67. {  
  68.     WAVEFORMATEX();  
  69.     WebRtc_UWord16 wFormatTag; //波形声音的格式,默认 WAVE_FORMAT_PCM = 1  
  70.     WebRtc_UWord16 nChannels; //音频文件的通道数量,单声道为1。立体声为2.  
  71.     WebRtc_UWord32 nSamplesPerSec; //指定样本速率(每秒的样本数)}。  
  72. //如果wFormatTag = WAVE_FORMAT_PCM,那么nSamplesPerSec通常为8.0 kHz, 11.025 kHz, 22.05 kHz和44.1 kHz。例如对于采样率为11.025 kHz的音频, //nSamplesPerSec 将被设为11025。对于非PCM格式的,请根据厂商的设定计算  
  73.     WebRtc_UWord32 nAvgBytesPerSec; //数据传输的平均速率(每秒的字节数,单位byte/s)。这个值对于创建缓冲大小是很有用的  
  74.     WebRtc_UWord16 nBlockAlign; //以字节为单位设置块对齐。块对齐是指最小数据的原子大小。如果wFormatTag= WAVE_FORMAT_PCM,nBlockAlign 为(nChannels*wBitsPerSample)/8。16 位立体声 PCM 的块对齐是 4 字节(每个样本2字节, 2个通道//对于非PCM格式请根据厂商的说明计算。  
  75.     WebRtc_UWord16 wBitsPerSample; //根据wFormatTag的类型设置<span style="color:#008000;">采样大小(字节)}每个样本的BIT数目,一般为16</span>。  
  76. //如果wFormatTag = WAVE_FORMAT_PCM,此值应该设为8或16,对于非PCM格式,根据厂商的说明设置。一些压缩的架构不能设置此值,此时wBitsPerSample应该为零。  
  77. //WebRtc_UWord16 cbSize; 额外信息的大小,以字节为单位,额外信息添加在WAVEFORMATEX结构的结尾。这个信息可以作为非PCM格式的wFormatTag额外属性,  
  78. //如果wFormatTag不需要额外的信息,此值必需为0,对于PCM格式此值被忽略。  
  79. };  
2、特点:

支持写avi文件和读avi文件以及循环读取

3、类AviFile的使用方法(可参考ModuleFileUtility类中三个成员变量  AviFile* _aviAudioInFile;AviFile* _aviVideoInFile;AviFile* _aviOutFile;的使用方法)
写文件操作:

[cpp]  view plain copy
  1.  AviFile* _aviOutFile;  
  2. _aviOutFile = new AviFile( );  
  3. //视频头结构体初始化  
  4.  AVISTREAMHEADER videoStreamHeader;  
  5.     videoStreamHeader.fccType = AviFile::MakeFourCc('v''i''d''s');  
  6.  videoStreamHeader.fccHandler = AviFile::MakeFourCc('I','4','2','0');  
  7.  videoStreamHeader.dwScale = 1;  
  8.   
  9.  BITMAPINFOHEADER bitMapInfoHeader;  
  10.     bitMapInfoHeader.biSize         = sizeof(BITMAPINFOHEADER);  
  11.     bitMapInfoHeader.biHeight       = videoCodecInst.height;  
  12.     bitMapInfoHeader.biWidth        = videoCodecInst.width;  
  13.     bitMapInfoHeader.biPlanes       = 1;  
  14.     bitMapInfoHeader.biBitCount     = 12;  
  15.     bitMapInfoHeader.biClrImportant = 0;  
  16.     bitMapInfoHeader.biClrUsed      = 0;  
  17.     bitMapInfoHeader.biCompression  = videoStreamHeader.fccHandler;  
  18.     bitMapInfoHeader.biSizeImage    = bitMapInfoHeader.biWidth *  
  19.         bitMapInfoHeader.biHeight * bitMapInfoHeader.biBitCount / 8;  
  20.     videoStreamHeader.dwRate                 = videoCodecInst.maxFramerate;  
  21.     videoStreamHeader.dwSuggestedBufferSize  = videoCodecInst.height *  
  22.         (videoCodecInst.width >> 1) * 3;  
  23.     videoStreamHeader.dwQuality              = (WebRtc_UWord32)-1;  
  24.     videoStreamHeader.dwSampleSize           = 0;  
  25.     videoStreamHeader.rcFrame.top            = 0;  
  26.     videoStreamHeader.rcFrame.bottom         = videoCodecInst.height;  
  27.     videoStreamHeader.rcFrame.left           = 0;  
  28.     videoStreamHeader.rcFrame.right          = videoCodecInst.width;  
  29.   //从代码看支持写入I420、VP8,  
  30.   //视频格式通过videoStreamHeader.fccHandler = AviFile::MakeFourCc('I','4','2','0');   
  31.   //bitMapInfoHeader.biCompression  = videoStreamHeader.fccHandler;设置  
  32.     if(_aviOutFile->CreateVideoStream(  
  33.             videoStreamHeader,  
  34.             bitMapInfoHeader,  
  35.             videoCodecInst.codecSpecific.MPEG4.configParameters,  
  36.             videoCodecInst.codecSpecific.MPEG4.configParametersSize) != 0)  
  37.         {  
  38.             return -1;  
  39.         }  
  40.   //音频头结构体初始化  
  41.   AVISTREAMHEADER audioStreamHeader;  
  42.         audioStreamHeader.fccType = AviFile::MakeFourCc('a''u''d''s');  
  43.         // fccHandler is the FOURCC of the codec for decoding the stream.  
  44.         // It's an optional parameter that is not used by audio streams.  
  45.         audioStreamHeader.fccHandler   = 0;  
  46.         audioStreamHeader.dwScale      = 1;  
  47.   
  48.   
  49.         WAVEFORMATEX waveFormatHeader;  
  50.         waveFormatHeader.cbSize          = 0;  
  51.         waveFormatHeader.nChannels       = 1;  
  52.   
  53. if (strncmp(audioCodecInst.plname, "PCMA", 4) == 0)  
  54.         {  
  55.             audioStreamHeader.dwSampleSize = 1;  
  56.             audioStreamHeader.dwRate       = 8000;  
  57.             audioStreamHeader.dwQuality    = (WebRtc_UWord32)-1;  
  58.             audioStreamHeader.dwSuggestedBufferSize = 80;  
  59.   
  60.   
  61.             waveFormatHeader.nAvgBytesPerSec = 8000;  
  62.             waveFormatHeader.nSamplesPerSec  = 8000;  
  63.             waveFormatHeader.wBitsPerSample  = 8;  
  64.             waveFormatHeader.nBlockAlign     = 1;  
  65.             waveFormatHeader.wFormatTag      = kWaveFormatALaw;  
  66.   
  67.   
  68.         }   
  69. //其他逻辑略,从代码看支持写入的音频格式为PCMA(ALOW),PCMU(MULAW) ,PCM,通过waveFormatHeader.wFormatTag = kWaveFormatPcm;设置  
  70.  if(_aviOutFile->CreateAudioStream(  
  71.             audioStreamHeader,  
  72.             waveFormatHeader) != 0)  
  73.         {  
  74.             return -1;  
  75.         }  
  76.   
  77.  _aviOutFile->Create(filename);  
  78. //写音频数据  
  79. _aviOutFile->WriteAudio(reinterpret_cast<const WebRtc_UWord8*>(buffer),bufferLengthInBytes);  
  80. //写视频数据  
  81. _aviOutFile->WriteVideo( reinterpret_cast<const WebRtc_UWord8*>(buffer), bufferLengthInBytes);  

读文件中音频操作:
[cpp]  view plain copy
  1.  AviFile* _aviAudioInFile;  
  2.   _aviAudioInFile = new AviFile();  
  3.  _aviAudioInFile->Open(AviFile::AVI_AUDIO, filename, loop);  
  4.   WAVEFORMATEX waveHeader;  
  5.         if(_aviAudioInFile->GetAudioStreamInfo(waveHeader) != 0)  
  6.         {  
  7.             return -1;  
  8.         }  
  9. //从代码看,只支持读取音频数据为PCM ,ALOW, MULOW 的文件  
  10. //读取音频数据  
  11. if(_aviAudioInFile->ReadAudio(  
  12.         reinterpret_cast<WebRtc_UWord8*>(outBuffer),  
  13.         length) != 0)  
  14.     {  
  15.         return -1;  
  16.     }  

读文件中视频操作:
[cpp]  view plain copy
  1.  AviFile* _aviVideoInFile;  
  2. _aviVideoInFile = new AviFile( );  
  3.  _aviVideoInFile->Open(AviFile::AVI_VIDEO,  
  4.                                                         filename, loop)  
  5.   AVISTREAMHEADER videoInStreamHeader;  
  6.     BITMAPINFOHEADER bitmapInfo;  
  7.     char codecConfigParameters[AviFile::CODEC_CONFIG_LENGTH] = {};  
  8.     WebRtc_Word32 configLength = 0;  
  9.     if( _aviVideoInFile->GetVideoStreamInfo(videoInStreamHeader, bitmapInfo,  
  10.                                             codecConfigParameters,  
  11.                                             configLength) != 0)  
  12. {  
  13.         return -1;  
  14. }  
  15. //从读取的bitmapInfo.biCompression看文件封装的视频格式,判断方式if (bitmapInfo.biCompression ==AviFile::MakeFourCc('V', 'P', '8', '0'))  
  16. //代码现在支持读取文件的视频格式为MP4V-ES,I420,H263,VP8  
  17. //读取视频数据  
  18.  if( _aviVideoInFile->ReadVideo( reinterpret_cast<WebRtc_UWord8*>(outBuffer),length) != 0)  
  19.  {  
  20.      return -1;  
  21.  }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值