下面的代码提取AVI中的视频,并另存一个AVI,可代码有问题(解决后,立即结贴)

jmcooler 2005-11-18 10:34:20
如果源AVI文件只有视频,则提取没问题,但源文件要是有视频和音频,那提取出来的视频播放不了,并且视频的码率参数和源文件不同。
long lStreamSize;

PAVIFILE pSrcFile = NULL;
PAVISTREAM pSrcStream = NULL;

AVISTREAMINFO SrcStreamInfo;
BITMAPINFOHEADER* pSrcBmpInfo = NULL;

PAVIFILE pDstFile = NULL;
PAVISTREAM pDstStream = NULL;

HRESULT hr = AVIFileOpen( &pSrcFile, "C:\\Downloads\\mg11.avi", OF_SHARE_DENY_WRITE|OF_READ, 0L );
hr = AVIFileGetStream( pSrcFile, &pSrcStream, streamtypeVIDEO, 0 );
if( hr != 0 )
return;

hr = AVIStreamInfo( pSrcStream, &SrcStreamInfo, sizeof(AVISTREAMINFO) );
if( SrcStreamInfo.fccType == streamtypeVIDEO )
{
hr = AVIStreamFormatSize( pSrcStream, 0, &lStreamSize );
pSrcBmpInfo = (BITMAPINFOHEADER*)new char[lStreamSize];
hr = AVIStreamReadFormat( pSrcStream, 0, pSrcBmpInfo, &lStreamSize );
}

//创建新的AVI文件
hr = AVIFileOpen( &pDstFile, "C:\\Downloads\\hld_1.avi", OF_WRITE|OF_CREATE, NULL );
hr = AVIFileCreateStream( pDstFile, &pDstStream, &SrcStreamInfo );
hr = AVIStreamSetFormat( pDstStream, 0, pSrcBmpInfo, lStreamSize );

long lReadBytes, lReadFrames, i;
char* pStreamBuf = new char[pSrcBmpInfo->biSizeImage];

for( i = AVIStreamStart(pSrcStream); i < AVIStreamEnd(pSrcStream); i++ )
{
DWORD dwKey = 0;
if( AVIStreamIsKeyFrame( pSrcStream, i ) )
dwKey = AVIIF_KEYFRAME;
hr = AVIStreamRead( pSrcStream, i, 1, pStreamBuf, pSrcBmpInfo->biSizeImage,
&lReadBytes, &lReadFrames );
hr = AVIStreamWrite( pDstStream, i, lReadFrames, pStreamBuf,
lReadBytes, dwKey, &lReadFrames, &lReadBytes );
}

AVIStreamRelease( pDstStream );
AVIFileRelease( pDstFile );

AVIStreamRelease( pSrcStream );
AVIFileRelease( pSrcFile );
delete [] pStreamBuf;
...全文
284 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkx2321 2006-06-22
  • 打赏
  • 举报
回复
要像根据自己的需要随心所欲的实现,首先想到的就应该是自己实现。

不麻烦如何能体现价值?

没有技术含量东西能值钱吗?
jmcooler 2005-11-21
  • 打赏
  • 举报
回复
这样好麻烦啊,还得自己解析读出的数据块
另外,我想在写AVI文件的时候,为每个采样/帧加上时戳,我想在每个采样数据的最后追加四个字节的“时间戳值”,一并写入流。以后当读出一个采样/帧后,我会从采样数据的末尾四个字节取出时戳,不知这样行不行。我还想当然地认为,这并不影响使用Window Media Player等播放器的播放,因为AVI文件中压缩采样/帧的解码,数据长度根本不重要,解码函数中根本就没有数据长度的参数,它会自己知道数据的字节数。因此系统解码器,自然会不理会我加的四个字节的时戳。
我想加时戳,出于这样的目的,当视频帧丢失,而音频没丢,或者当音频帧丢失,而视频没丢时,AVI标准格式无法表达这种情况,最后将导致视音频播放不同步的情况。AVI标准格式是假定视频音频本身没有任何丢失,因此它依顺序流写入,播放时,它计算每个帧相对的播放时间点,来处理解码播放。
不知道可行否,现在来不及做测试。
zkx2321 2005-11-19
  • 打赏
  • 举报
回复
根据RIFF文件格式直接读数据块。
jmcooler 2005-11-18
  • 打赏
  • 举报
回复
问zkx2321() ,你的解决方法是什么,能告诉我吗?
QQ号:41997220
zkx2321 2005-11-18
  • 打赏
  • 举报
回复
关于这个问题,我俩的解决方法根本不同,我对你的方法不熟悉,帮不了你。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧