使用FFMPEG编码保存MPEG-1/MPEG-2文件格式

一、关于VCD/SVCD/DVD
    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;
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值