纯视频数据流写avi文件问题

azurezt 2010-05-05 03:11:21
我现在要进行的预录像的操作
即先把视频流写入一个缓冲区,事件出发后才进行录像的操作,把缓冲区的数据写入文件。

我想写入一个avi文件,应该如何操作, 环境:linux

说明:
1.视频流是经过MPEG4压缩的
2.调用avifile.c写avi文件是一帧一帧的写数据,这样能判断是否是关键帧,而我现在要进行的是要吧缓冲区的所有数据一次性写入到avi文件中。这样的话文件头和索引块应该怎么写?
3.不要索引块的话,加上文件头,播放器可以播放么? 此时文件头应该怎么写?“00dc”好像是作为数据块的开始,这个应该在什么地方加入?
...全文
444 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiuYinChina 2012-01-12
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/RobertBaker/3479509
hping1016 2012-01-12
  • 打赏
  • 举报
回复

//1.设定bmp文件头
int nVideoWidth = 352;
int nVideoHeight = 288;
DWORD fccHandler = mmioFOURCC('H','2','6','4'); //mp4修改成相应的

if (fccHandler == 0) return false;
if (nVideoWidth == 0 || nVideoHeight == 0) return false;

int biBitCount = 24;
int m_sizeimage = nVideoWidth * nVideoHeight * (biBitCount / 8);

BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biBitCount = (WORD)biBitCount;
bih.biWidth = nVideoWidth;
bih.biHeight = nVideoHeight;
bih.biSizeImage = m_sizeimage;
bih.biCompression = fccHandler;
bih.biPlanes = 1;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;

//2.设定avi流信息
AVISTREAMINFO strmInfoVideo;
ZeroMemory(&strmInfoVideo, sizeof(strmInfoVideo));
strmInfoVideo.fccType = streamtypeVIDEO;
strmInfoVideo.fccHandler = fccHandler;
strmInfoVideo.dwScale = 100;
strmInfoVideo.dwRate = uRate;
strmInfoVideo.dwStart = 0;
strmInfoVideo.dwLength = 0;
strmInfoVideo.dwInitialFrames = 0;
strmInfoVideo.dwSuggestedBufferSize = 0;
strmInfoVideo.dwQuality = -1;
strmInfoVideo.dwSampleSize = 0;
strmInfoVideo.dwEditCount = 0;
strmInfoVideo.dwFormatChangeCount = 0;
strmInfoVideo.dwSampleSize = 0;
SetRect(&strmInfoVideo.rcFrame, 0, 0, (int)bih->biWidth, (int)bih->biHeight);

//3.创建avi文件(视频流/音频流/文字流、),avi流(视频流)
PAVIFILE paviFile;
PAVISTREAM pstrmVideo;
HRESULT hr = AVIFileCreateStream(paviFile, &strmVideo, &strmInfoVideo);
if (hr != 0)
{
AVIFileRelease(aviFile);
return FALSE;
}
//4.向视频流写视频帧
hr = AVIStreamWrite(pstrmVideo, frameNo, 1, buf, sizeImage, bKeyFrame ? AVIIF_KEYFRAME : 0, NULL, NULL);
blackmash 2010-05-08
  • 打赏
  • 举报
回复
可以,但是不是支架00dc就可以了,还需要加一下这个chunk的size(4个字节表示)。如下:
00dc size frame
00dc size frame
如果要加索引
你可以将每个frame都添加一个索引。
idx1 索引大小(4字节)
索引内容

每一笔索引由下面组成
4字节:chunkid
4字节:flag (可以知道是否是key frame,用于快转或time seek)
4字节:offset
4字节:size

azurezt 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 blackmash 的回复:]

建议看一下RIFF文件格式。index需要保存在fourcc为idx1的地方,你的视频数据保存在fourcc为movi区域。
另外,'00dc'也不是表示数据的开始,数据的开始是看movi这个标记的。
00dc,00表示stream id,dc表示压缩过的视频流。
另外,不要一次性把你的所有数据全部写avi,一般一个frame 添加一个00dc
[/Quote]

我是不是可以在每一帧数据写入缓冲区的时候就加上“00dc”
写文件的时候,写入avi文件头之后,再把缓冲区的数据一次性写入文件,这样可行么?

如果要加索引的话怎么加?
blackmash 2010-05-07
  • 打赏
  • 举报
回复
建议看一下RIFF文件格式。index需要保存在fourcc为idx1的地方,你的视频数据保存在fourcc为movi区域。
另外,'00dc'也不是表示数据的开始,数据的开始是看movi这个标记的。
00dc,00表示stream id,dc表示压缩过的视频流。
另外,不要一次性把你的所有数据全部写avi,一般一个frame 添加一个00dc
ccpaishi 2010-05-06
  • 打赏
  • 举报
回复
不要索引不能拖拉,放是可以的。ffmpeg有现成的,可以参考。
jtujtujtu 2010-05-06
  • 打赏
  • 举报
回复
顶~
我也想知道

2,554

社区成员

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

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