利用ffmpeg将RTSP传输的h264原始码流保存到文件中
2015-07-27 20:12
555 查看
利用ffmpeg将RTSP传输的h264原始码流保存到文件中,没有做任何处理,直接将h264码流保存到文件中。
其中测试的RTSP地址是网上公开的一个 rtsp流媒体测试地址。
下面是程序:
控制台打印的信息如下:
最后保存的h264码流的文件用h264播放器打开后如下:
整个VS2012工程文件可以在这里下载。
参考文章:http://blog.csdn.net/leixiaohua1020/article/details/38868499
其中测试的RTSP地址是网上公开的一个 rtsp流媒体测试地址。
下面是程序:
/** *作者:HJL *最后更新:2015.7.18 *利用ffmpeg将RTSP传输的h264原始码流保存到文件中 *未加任何效果,不显示 **/ #include <stdio.h> #define __STDC_CONSTANT_MACROS #ifdef _WIN32 //Windows extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "SDL2/SDL.h" }; #else //Linux... #ifdef __cplusplus extern "C" { #endif #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> #include <SDL2/SDL.h> #ifdef __cplusplus }; #endif #endif int main(int argc, char* argv[]) { ***FormatContext *pFormatCtx; int i, videoindex; ***CodecContext *pCodecCtx; ***Codec *pCodec; ***Frame *pFrame,*pFrameYUV; uint8_t *out_buffer; ***Packet *packet; int ret, got_picture; struct SwsContext *img_convert_ctx; //下面是公共的RTSP测试地址 char filepath[]="rtsp://218.204.223.237:554/live/1/0547424F573B085C/gsfp90ef4k0a6iap.sdp"; av_register_all(); avformat_network_init(); pFormatCtx = avformat_alloc_context(); if(avformat_open_input(&pFormatCtx,filepath,NULL,NULL)!=0)////打开网络流或文件流 { printf("Couldn't open input stream.\n"); return -1; } if(avformat_find_stream_info(pFormatCtx,NULL)<0) { printf("Couldn't find stream information.\n"); return -1; } videoindex=-1; for(i=0; i<pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type==***MEDIA_TYPE_VIDEO) { videoindex=i; break; } if(videoindex==-1) { printf("Didn't find a video stream.\n"); return -1; } pCodecCtx=pFormatCtx->streams[videoindex]->codec; pCodec=avcodec_find_decoder(pCodecCtx->codec_id); if(pCodec==NULL) { printf("Codec not found.\n"); return -1; } if(avcodec_open2(pCodecCtx, pCodec,NULL)<0) { printf("Could not open codec.\n"); return -1; } pFrame=av_frame_alloc(); pFrameYUV=av_frame_alloc(); out_buffer=(uint8_t *)av_malloc(avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height)); avpicture_fill((***Picture *)pFrameYUV, out_buffer, PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height); //Output Info---输出一些文件(RTSP)信息 printf("---------------- File Information ---------------\n"); av_dump_format(pFormatCtx,0,filepath,0); printf("-------------------------------------------------\n"); img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL); packet=(***Packet *)av_malloc(sizeof(***Packet)); FILE *fpSave; if((fpSave = fopen("geth264.h264", "ab")) == NULL) //h264保存的文件名 return 0; for (;;) { //------------------------------ if(av_read_frame(pFormatCtx, packet)>=0) { if(packet->stream_index==videoindex) { fwrite(packet->data,1,packet->size,fpSave);//写数据到文件中 } av_free_packet(packet); } } //-------------- av_frame_free(&pFrameYUV); av_frame_free(&pFrame); avcodec_close(pCodecCtx); avformat_close_input(&pFormatCtx); return 0; }
控制台打印的信息如下:
最后保存的h264码流的文件用h264播放器打开后如下:
整个VS2012工程文件可以在这里下载。
参考文章:http://blog.csdn.net/leixiaohua1020/article/details/38868499
相关文章推荐
- 课程笔记 16:数据结构(清华) 图-邻接矩阵
- mina简单编解码器示例
- Linux下C语言执行MySQL语句 http://www.2cto.com/database/201312/268374.html
- 使用TCP协议的NAT穿透技术 (转)
- uvaLive5713 次小生成树
- c++对象模型
- 关于mysql数据库数据恢复-日志恢复
- iOS UI篇 学习笔记 UIButton,UIImageView
- 2008 数值统计
- vld
- 数据科学家可能成为2015年最热门职业
- firefox按住ctrl在原页面打开新的标签页
- UVA10818-Andy's First Dictionary
- Oracle之优化sql
- 求矩阵的模n^3logn
- [Z] 如何熟悉一个开源项目?
- 畅通工程再续
- [cocos2dx]概念——坐标系
- C语言对char*的封装,形成buffer
- HTML和XML的区别