1、VCD采用的是MPEG-1技术标准,清晰度在250线左右,仅相当于普通录像机的水平;VCD是1路立体声输出,唱卡拉OK时两个声道可分别存储原唱和纯伴音两路信号。
2、SVCD采用的是MPEG-2技术标准,清晰度达到了350线;SVCD可以提供2路立体声和4路单声道。
3、DVD采用的是MPEG-2技术标准,清晰度已达到500线;DVD可提供2个立体声声道和1个5+1杜比AC-3环绕立体声声道,可提供高质量的环绕立体声。
除此之外VCD、SVCD、DVD还增加了多种语言的字幕等功能。三者均采用直径为12cm的光碟,但容量不一样。DVD碟片的存储容量最大达120分钟以上;SVCD的容量最小,为45分钟;VCD介于三者之间,为74分钟。比如存储同一部120分钟的故事片,需用一张DVD碟片,两张VCD碟片,3-4张SVCD碟片。
二、关于PAL/NTSC制式
NTSC和PAL属于全球两大主要的电视广播制式,但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写,其标准主要应用于日本、美国,加拿大、墨西哥等地,NTSC每秒29.97帧(简化为30帧),每帧有525线(60Hz);PAL 则是Phase Alternating Line的缩写,主要应用于中国,香港、中东地区和欧洲一带,PAL每秒25帧,每帧有625线(50Hz)。这两种制式是不能互相兼容的,如果在PAL制式的电视上播放NTSC的影像,画面将变成黑白,NTSC制式的也是一样。
三、使用FFMPEG保存MPEG-1、MPEG-2代码如下:
1、这是06年5月写的部分代码,暂时不支持音频,因为FFMPEG音频裁减功能还不强大,也不支持背景声音,以后会加入,有兴趣的可以继续关注此帖。
2、ffmpeg的dll大家可以到 http://www.chinavideo.org/ 直接去下载编译好的。
//STMPEG.h
#pragma once
#include "avformat.h"
class CSTMPEG
{
public:
CSTMPEG();
~CSTMPEG(void);
//打开一个文件写mpeg
bool OpenMPEG(const char* strfile);
//写一帧图象数据到mpeg文件
int AddFrame(int width, int height, int bpp, uint8_t* pRGBBuffer);
//释放资源
void CloseMPEG();
enum MPEG_TYPE{
VCD_PAL,
VCD_NTSC,
SVCD_PAL,
SVCD_NTSC,
DVD_PAL,
DVD_NTSC,
CUSTOM_MPEG1,
CUSTOM_MPEG2
};
//设置MPEG的类型
void SetMPEGFormat(MPEG_TYPE type);
//设置画面宽度
void SetMPEGWidth(int width);
//设置画面高度
void SetMPEGHeight(int height);
//设置帧率(fps)
void SetFrameRate(float rate);
//设置视频码率(kbits/sec) rate: 3000 4000 6000 8000
void SetMPEGVideoBitRate(float rate);
private:
void InitMPEGData(MPEG_TYPE type);
//把图象颠倒过来
void RGBBuffer2RGBFrame(AVFrame *pRGBFrame, int width, int height, int bpp, uint8_t* pRGBBuffer);
AVFrame *alloc_picture(int pix_fmt, int width, int height);
bool open_video(AVFormatContext *pFormatContext, AVStream *pVideoStream);
AVStream *add_video_stream(AVFormatContext *pFormatContext, int codec_id);
bool write_video_frame(AVFormatContext *pFormatcontext, AVStream *pAudioStream);
void close_video(AVFormatContext *pFormatcontext, AVStream *pVideoStream);
private:
MPEG_TYPE m_MPEGType;
int m_nWidth, m_nHeight;
float m_fFrameRate;
float m_fBitRate;
int m_nFrame;
AVFrame *m_pRGBFrame; //YUV帧数据
AVFrame *m_pYUVFrame; //RGB帧数据
uint8_t* m_pOutBuf; //将一帧数据编码到这个缓冲区,用于写入到文件
const int m_nOutBufSize; //编码缓冲区的大小
//使用流来读写文件
AVOutputFormat *m_pOutputFormat;
AVFormatContext *m_pFormatContext;
AVStream *m_pVideoStream;