周星驰来也!
像很多80,90后年轻人(老男人吧)一样,周星驰一直就是哥喜爱的电影演员之一,不仅喜欢星爷的人物形象,更是喜欢这种乐观向上的精神!(哥16年的QQ一直就是周星驰这个昵称)。
转入主题吧:
本文demo下载地址http://download.csdn.net/download/xjb2006/10119982
在QQ技术群里,很多人都在研究ffmpeg,因为功能强大,简单直接就能实现想要的功能,但是想要用好,还是要下一些功夫。
今天的主题就是怎样实现对h264,aac流输入,合成后输出ts,m3u8,即HLS,苹果设备的点播方案!!!!!!!!!!!!!!!!!!!!
网上有很多关于文件转mp4或者其他文件格式的例子,但是换成数据流输入了,怎么办呢?很多人也是一筹莫展。网上也鲜有这种代码或者文章。
今天,哥哥就顺便说几句,关于我自己的一些想法。
晚上有很多例子是关于输入视频文件的,对我们有些参考,但是要换成输入h264或者aac数据流,大家都是没办法啊。
1、HLS是什么?
HLS (HTTP Live Streaming)是Apple的动态码率自适应技术(复制过来的),只有苹果的浏览器才能直接用,因为苹果不支持flash控件(自然也不支持rtmp),所以才有了HLS技术用于点播直播。调试的时候可以下载一个VLC播放器,这个播放器可以打开m3u8。
2、TS文件
百度这样说的:“ts是高清摄像机拍摄下进行的封装格式,全称为MPEG2-TS。ts即"Transport Stream"的缩写。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。先不管这些了,反正HLS就要用到TS格式的文件,一个一个的。贴张图吧,百说不如一见:
3、m3u8文件
M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。
M3U8文件举例,例如使用云图TV点播直播节目时,发送请求:
http://121.199.63.236:7613/m3u8/cckw1/szws.m3u8?
看到没,其实苹果的点播就是http上直接访问。
4、实现过程和思路:
设置存ts,m3u8的路径,输入h264和aac流,根据设置的ts长度和个数,不断更新ts文件和m3u8文件
说了这么多基础,来点实际的吧:
我封装的最后的接口函数:
void StartHLS(CString szPath,CString szName="xiao");//开始启动hls,路径为保存m3u8和ts的路径
void SetAudioProperty(int channels, int samplerate, int bitspersample);
void SetVideoProperty(int width, int height, double framerate);
void StopHLS(void);
void H264In(BYTE* pH264, LONG nH264Len, LONG nTimeStamp=0);
void AACIn(BYTE* pAAC, LONG nAACLen, LONG nTimeStamp=0);
调用ffmpeg的步骤:
av_register_all();
定义几个全局的:
AVFormatContext* output_format_context;//输出文件结构上下文
AVStream* o_video_stream ;
AVStream *o_audio_stream ;
输入h264关键帧:
通过关键帧获取视频信息并
avio_alloc_context(这个函数很多文章或者代码里面都没有提到过吧),生成一个自定义输入io,用来探测h264的格式
//读入数据avformat_open_input
//设置输入结构体信息
avformat_find_stream_info
//设置输出文件格式信息
avformat_alloc_output_context2
//打开输出文件
avio_open
//添加音视频流
avformat_new_stream
//写入头
av_dump_format、avformat_write_header
至此,文件初始化工作完成
接下来写数据啦
av_packet_from_data、av_packet_rescale_ts、av_interleaved_write_frame、av_write_trailer
最后记得释放
avio_close、avformat_free_context
完了,搞完收工!!!!!!看看效果
中间有很多困扰:枚举下:比如ts文件格式必须输入的aac为 ADTS编码的,即有7个字节的头,没有就别想播放。
音视频同步,主要还是通过音视频时间戳pts,dts同步的。m3u8及ts文件更新,根据设置的一个ts文件秒数和个数进行不断更新,比如设置的5秒一个,一共3个,那么,每隔3秒,保存ts并创建新的ts,然后更新m3u8文件信息.
我的m3u8文件内容:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:103
#EXTINF:10,
xiao-103.ts
#EXTINF:10,
xiao-104.ts
#EXTINF:10,
xiao-105.ts
测试的时候,装备一台苹果手机(肾没了没办法就下载个VLC播放器也行),一个免费的http服务器软件,我下的免费的easywebserver。准备h264数据源和AAC数据源,这方面办法很多,读h264,aac文件,截取屏幕或者摄像头,aac获取麦克风转成AAC,或者输入音频文件转成AAC(编码一定要有 ADTS 头啊,切记切记)
但是上面说了这么多,应该也能自己做了吧。什么时候传个DEMO上来,有空再说吧
传点代码(关键的一段):
今天花了2个小时把DEMO做好了,可以下载看看效果,有问题或者需要交流,可以联系我,谢谢(前面一个是v2版本,后面是v1版本)
http://download.csdn.net/download/xjb2006/10119982
http://download.csdn.net/download/xjb2006/10106146
*需要合作的联系QQ35744025,可以当当技术顾问或者核心技术提供,本人03年从事工作,“精通”音视频应用编程技术(勉强加个精通,吸引眼球,哈哈),精通VC,MFC,多媒体教学软件,录播软件,直播软件的核心技术大部分已掌握,如ffmpeg技术,Directshow技术,MP4,FLV编码合成,H264,AAC,MP3,可以运用IPP进行高效图像空间转换等,可以运用INTEL和cuda进行硬件H264编解码,可以实现240帧1080P实时编码,完全同步及平滑度极高,rtmp,HLS直播推送,rtmp服务器,YV12,YUV422,NV12,RGB24,RGB32熟悉转换,缩放,wav,AAC, mp3的编码解码,视频切换特效算法,视频水印,LOGO,文字。屏幕截取录像,摄像头捕获录像,D3D高效视频图像显示,OPENCV,图像库ximage,GDI,GDIPLUS熟练应用,语音识别及文字转换,人脸识别及匹配,局域网内远程控制,音视频实时通话,声卡捕获回放等,另外SQL数据库,ACCESS,EXCEL数据库,DOC,PDF文件打开提取,FTPServer,Client,以上所有代码均已商用。