实例介绍
【实例简介】
【实例截图】
【核心代码】
// CGaveFile.cpp : 定义控制台应用程序的入口点。 // /* Copyright [c] 2017-2027 By www.chungen90.com Allrights Reserved This file give a simple example of how to save net stream to local file. Any questions, you can join QQ group for help, QQ Group number: 766718184 or 127903734. */ #include "stdafx.h" #include "pch.h" #include <string> #include <memory> #include <thread> #include <iostream> using namespace std; AVFormatContext *inputContext = nullptr; AVFormatContext * outputContext; int64_t lastReadPacktTime ; static int interrupt_cb(void *ctx) { int timeout = 3; if(av_gettime() - lastReadPacktTime > timeout *1000 *1000) { return -1; } return 0; } int OpenInput(string inputUrl) { inputContext = avformat_alloc_context(); lastReadPacktTime = av_gettime(); inputContext->interrupt_callback.callback = interrupt_cb; int ret = avformat_open_input(&inputContext, inputUrl.c_str(), nullptr,nullptr); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "Input file open input failed\n"); return ret; } ret = avformat_find_stream_info(inputContext,nullptr); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "Find input file stream inform failed\n"); } else { av_log(NULL, AV_LOG_FATAL, "Open input file %s success\n",inputUrl.c_str()); } return ret; } shared_ptr<AVPacket> ReadPacketFromSource() { shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_packet_free(&p); av_freep(&p);}); av_init_packet(packet.get()); lastReadPacktTime = av_gettime(); int ret = av_read_frame(inputContext, packet.get()); if(ret >= 0) { return packet; } else { return nullptr; } } void av_packet_rescale_ts(AVPacket *pkt, AVRational src_tb, AVRational dst_tb) { if (pkt->pts != AV_NOPTS_VALUE) pkt->pts = av_rescale_q(pkt->pts, src_tb, dst_tb); if (pkt->dts != AV_NOPTS_VALUE) pkt->dts = av_rescale_q(pkt->dts, src_tb, dst_tb); if (pkt->duration > 0) pkt->duration = av_rescale_q(pkt->duration, src_tb, dst_tb); } int WritePacket(shared_ptr<AVPacket> packet) { auto inputStream = inputContext->streams[packet->stream_index]; auto outputStream = outputContext->streams[packet->stream_index]; av_packet_rescale_ts(packet.get(),inputStream->time_base,outputStream->time_base); return av_interleaved_write_frame(outputContext, packet.get()); } int OpenOutput(string outUrl) { int ret = avformat_alloc_output_context2(&outputContext, nullptr, "mpegts", outUrl.c_str()); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "open output context failed\n"); goto Error; } ret = avio_open2(&outputContext->pb, outUrl.c_str(), AVIO_FLAG_WRITE,nullptr, nullptr); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "open avio failed"); goto Error; } for(int i = 0; i < inputContext->nb_streams; i ) { AVStream * stream = avformat_new_stream(outputContext, inputContext->streams[i]->codec->codec); ret = avcodec_copy_context(stream->codec, inputContext->streams[i]->codec); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "copy coddec context failed"); goto Error; } } ret = avformat_write_header(outputContext, nullptr); if(ret < 0) { av_log(NULL, AV_LOG_ERROR, "format write header failed"); goto Error; } av_log(NULL, AV_LOG_FATAL, " Open output file success %s\n",outUrl.c_str()); return ret ; Error: if(outputContext) { for(int i = 0; i < outputContext->nb_streams; i ) { avcodec_close(outputContext->streams[i]->codec); } avformat_close_input(&outputContext); } return ret ; } void CloseInput() { if(inputContext != nullptr) { avformat_close_input(&inputContext); } } void CloseOutput() { if(outputContext != nullptr) { for(int i = 0 ; i < outputContext->nb_streams; i ) { AVCodecContext *codecContext = outputContext->streams[i]->codec; avcodec_close(codecContext); } avformat_close_input(&outputContext); } } void Init() { av_register_all(); avfilter_register_all(); avformat_network_init(); av_log_set_level(AV_LOG_ERROR); } int _tmain(int argc, _TCHAR* argv[]) { Init(); int ret = OpenInput("rtsp://admin:qsy123456@192.168.1.223:554/Streaming/Channels/1"); if(ret >= 0) { ret = OpenOutput("D:\\test.ts"); } if(ret <0) goto Error; while(true) { auto packet = ReadPacketFromSource(); if(packet) { ret = WritePacket(packet); if(ret >= 0) { cout<<"WritePacket Success!"<<endl; } else { cout<<"WritePacket failed!"<<endl; } } else { break; } } Error: CloseInput(); CloseOutput(); while(true) { this_thread::sleep_for(chrono::seconds(100)); } return 0; }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论