mov编码h264跟mp4编码h264的区别?
如何实时h264编码及aac编码
首先是捕获,这里采用了DirectShow的方式,对它进行了一定程度的封装,包括音视频。好处是直接使用native api,你可以做想做的任何修改,坏处是,不能跨平台,采集音视频这种应用,linux平台也是需要滴呀。有跨平台的做法,对视频,可以使用OpenCV,对音频,可以使用OpenAL或PortAudio等,这样就行了。
编码可以选择的余地比较大,对视频来讲,有H264, MPEG-4, WebM/VP8, Theora等,音频有Speex, AAC, Ogg/Vorbis等,它们都有相应的开源项目方案,我采用的是x264进行H264编码,libfaac进行aac编码,之后是否更改编码方案,等具体项目需求再说了。这里提一下WebM,Google牵头的项目,完全开放和自由,使用VP8和Vorbis编码,webm(mkv)封装,有多家巨头支持,目的是想要取代当前的H264视频编码,号称比后者更加优秀,我没有测试过实际效果。不过有商业公司牵头就是不一样,各项支持都很全面,有时间了关注一下。
2. 逻辑和流程
基本的思想是实现dshow ISampleGrabberCB接口,通过回调来保存每一个buffer。除了界面线程和dshow自己的线程之外,我们启动了两个线程,AudioEncoderThread和VideoEncoderThread,分别从SampleGrabber中取出数据,调用编码器进行编码,编码后的文件可以直接输出。看图:
程序是用VS2010构建的,看张工程截图:
Base下面的是对系统API的一些简单封装,主要是线程和锁。我这里简单也封装的了一下dshow的捕获过程,包括graph builder的创建,filter的连接等。directshow是出了名的难用,没办法,难用也得用。因为是VS2010,调用的Windows SDK 7.1中的dshow,没有qedit.h这个文件,而它正式定义ISampleGrabberCB的。不急,系统中还是有qedit.dll的,我们要做的就是从Windows SDK 6.0中,把它拷过来,然后在stdafx.h中加入这几行代码,就可以了
1 #pragma include_alias( "dxtrans.h", "qedit.h" )
2 #define __IDxtCompositor_INTERFACE_DEFINED__
3 #define __IDxtAlphaSetter_INTERFACE_DEFINED__
4 #define __IDxtJpeg_INTERFACE_DEFINED__
5 #define __IDxtKey_INTERFACE_DEFINED__
6 #include "qedit.h"
3. 音视频编码
相关文件:
Encoder下就是音视频编码相关的代码。X264Encoder封装了调用x264编码器的操作,FAACEncoder封装了调用libfaac编码器的操作,VideoEncoderThread和AudioEncoderThread负责主要的流程。下面我把关键代码贴出来,大家可以参考一下。
A. 视频编码线程
主要流程是首先初始化x264编码器,然后开始循环调用DSVideoGraph,从SampleGrabber中取出视频帧,调用x264进行编码,流程比较简单,调用的频率就是你想要获取的视频帧率。要注意的一点是,x264进行编码比较耗时,在计算线程Sleep时间时,要把这个过程消耗的时间算上,以免采集的视频帧率错误。
B. 音频编码线程
主要流程和视频编码线程相同,也是初始化FAAC编码器,然后循环调用DSAudioGraph,从SampleGrabber中取出视频帧,调用faac进行编码。和视频不同的是,音频的sample的频率是非常快的,所以几乎要不断的进行采集,但前提是SampleGrabber中捕获到新数据了才行,不然你的程序cpu就100%了,下面代码中IsBufferAvailaber()就是做这个检测的。
调用faac进行编码的时候,有点需要注意,大家特别注意下,不然编码出来的音频会很不正常,搞不好的话会很头疼的。先看下faac.h的相关接口
1 faacEncHandle FAACAPI faacEncOpen(unsigned long sampleRate, unsigned int numChannels,2 unsigned long *inputSamples, unsigned long *maxOutputBytes);3 4 int FAACAPI faacEncEncode(faacEncHandle hEncoder, int32_t * inputBuffer, unsigned int samplesInput,5 unsigned char *outputBuffer, unsigned int bufferSize);
faacEncEncode第三个参数指的是传入的sample的个数,这个值要和调用faacEncOpen返回的inputSamples相等。要做到这点,就要在dshow中设置好buffsize,公式是:
BufferSize = aac_frame_len * channels * wBytesPerSample// aac_frame_len = 1024
相关内容扩展阅读:
hdmi数据能压缩为H.265吗
hdmi传输将带来带宽压力的增加和时延的增长等,基于H265编解码提出一种新的高清视频传输系统设计方法来改善上述情况。系统首先采用Hi3516A处理器对高清视频进行H265硬编码。
对于H.264在传输码率减半时解码后图像的PSNR值与经H264编解码解码后图像的PSNR值基本相同。但在高清1080P视频采集条件下,H265编解码在1M码率传输时解码后图像的PSNR值明显优于H264编解码在2M码率传输时解码后图像的PSNR值。
h264是什么视频格式,这种格式有什么特点
h264是什么视频格式,这种格式和其他格式相比有什么特点,如avi,mpg等,谢谢不是格式
H264压缩后通常会以TS或者TP格式封装,移动设备上通常是.MP4
相对于MPEG2来说
H264压缩率更高
所以相同信息量下H264压缩后体积更小
基本上一部高清电影如果是MPEG2压缩需要100G左右二H264编码方式下只需要25G左右。
相比MPG(MPEG1
VCD)来说压缩率大的多,比之AVI来说也要强大很多
另外你说的其实不是一个概念
而且通常状况下H264是用来压缩高清视频用的
AVI和MPG则不一定,等体积的情况下
H264模式压缩出来的质量更好。
h264格式文件播放器,谢谢。
MilkPlayer播放器,操作方法如下:
1、264文件是H264的源头文件。

2、将后缀改为mp4。

3、系来统识别了,双源击打开百,系统自带播放度器无法播放。尝试打开方式选择播放器中出现了MilkPlayer,选择MilkPlayer

4、发现可以正常播放。

5、打开方式直接选择在电脑中查找其他应用。

6、选择MilkPlayer播放器,双击文件就可以直接打开了。

扩展资料:
H.264中帧内编码的技术和以前标准一样,值得注意的是:
(1)H.264中的帧内预测编码宏块的参考宏块可以是帧间编码宏块,帧内预测宏块并不像H.263中的帧内编码一样,而采用预测的帧内编码比非预测的帧 内编码有更好的编码效率,但减少了帧内编码的重同步性能,可以通过设置限制帧内预测标记来恢复这一性能。
(2)只包含帧内宏块的片有两种,一种是帧内片(Islice),一种是立即刷新片(IDRslice),立即刷新片必存在于立即刷新图像 (IDRpicture)中。与短期参考图像相比,立即刷新图像有更强壮的重同步性能。














