AVOutputFormat *ofmt = NULL;
//Input AVFormatContext and Output AVFormatContext
AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
AVPacket pkt;
const char *in_filename, *out_filename;
int ret, i;
int videoindex = -1;
int frame_index = 0;
AVBitStreamFilterContext* adtstoasc = av_bitstream_filter_init("aac_adtstoasc");
in_filename = src;//"rtsp://192.168.222.222:554/1.sdp";
out_filename = des;//"rtmp://192.168.222.222/live/1";
//Input
if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
printf("Could not open input file. in_filename(%s)\n", in_filename);
goto end;
}
if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
printf("Failed to retrieve input stream information");
goto end;
}
for (i = 0; i<ifmt_ctx->nb_streams; i++)
if (ifmt_ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
videoindex = i;
break;
}
av_dump_format(ifmt_ctx, 0, in_filename, 0);
//Output
avformat_alloc_output_context2(&ofmt_ctx, NULL, "flv", out_filename); //RTMP
if (!ofmt_ctx) {
printf("Could not create output context\n");
ret = AVERROR_UNKNOWN;
goto end;
}
ofmt = ofmt_ctx->oformat;
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
//Create output AVStream according to input AVStream
AVStream *in_stream = ifmt_ctx->streams[i];
AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
if (!out_stream) {
printf("Failed allocating output stream\n");
ret = AVERROR_UNKNOWN;
goto end;
}
//Copy the settings of AVCodecContext
ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
if (ret < 0) {
printf("Failed to copy context from input to output stream codec context\n");
goto end;
}
out_stream->codec->codec_tag = 0;
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
}
//Dump Format------------------
av_dump_format(ofmt_ctx, 0, out_filename, 1);
//Open output URL
if (!(ofmt->flags & AVFMT_NOFILE)) {
ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
if (ret < 0) {
printf("Could not open output URL '%s'", out_filename);
goto end;
}
}
//Write file header
ret = avformat_write_header(ofmt_ctx, NULL);
if (ret < 0) {
printf("Error occurred when opening output URL\n");
goto end;
}
#if USE_H264BSF
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
#endif
while (1) {
AVStream *in_stream, *out_stream;
//Get an AVPacket
ret = av_read_frame(ifmt_ctx, &pkt);
if (ret < 0)
break;
//printf("--1----=%8d------=%d-----------\n",pkt.pts, pkt.stream_index);
in_stream = ifmt_ctx->streams[pkt.stream_index];
out_stream = ofmt_ctx->streams[pkt.stream_index];
/* copy packet */
//Convert PTS/DTS
pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
pkt.pos = -1;
//Print to Screen
if (pkt.stream_index == videoindex) {
//printf("Receive %8d video frames from input URL\n", frame_index);
frame_index++;
#if USE_H264BSF
av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
#endif
}
else {
av_bitstream_filter_filter(adtstoasc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
}
//ret = av_write_frame(ofmt_ctx, &pkt);
ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
if (ret < 0 && frame_index > 3) {
printf("Error muxing packet\n");
break;
}
av_free_packet(&pkt);
}
#if USE_H264BSF
av_bitstream_filter_close(h264bsfc);
#endif
av_bitstream_filter_close(adtstoasc);
//Write file trailer
av_write_trailer(ofmt_ctx);
end:
avformat_close_input(&ifmt_ctx);
/* close output */
if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
avio_close(ofmt_ctx->pb);
avformat_free_context(ofmt_ctx);
printf("-----finish------\n");
if (ret < 0 && ret != AVERROR_EOF) {
printf("Error occurred.\n");
return -1;
}
return 0;
FFmpeg RTSP轉RTMP
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門缚甩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萨蚕,“玉大人,你說我怎么就攤上這事蹄胰≡酪#” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵裕寨,是天一觀的道長浩蓉。 經(jīng)常有香客問我,道長宾袜,這世上最難降的妖魔是什么捻艳? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮庆猫,結果婚禮上认轨,老公的妹妹穿的比我還像新娘。我一直安慰自己月培,他們只是感情好嘁字,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杉畜,像睡著了一般纪蜒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上此叠,一...
- 文/蒼蘭香墨 我猛地睜開眼显沈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了析校?” 一聲冷哼從身側響起,我...
- 正文 年R本政府宣布幻林,位于F島的核電站,受9級特大地震影響音念,放射性物質發(fā)生泄漏沪饺。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一闷愤、第九天 我趴在偏房一處隱蔽的房頂上張望整葡。 院中可真熱鬧,春花似錦讥脐、人聲如沸遭居。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽魏滚。三九已至,卻和暖如春坟漱,著一層夾襖步出監(jiān)牢的瞬間鼠次,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 前言 在實際的項目開發(fā)中掂摔,需要網(wǎng)站平臺接入實時視頻流术羔,實現(xiàn)遠程監(jiān)控。使用阂依欤康的攝像機器级历;傳送的是rtsp格式的視頻...
- 不好意思,這里先安利下自己最近上架的應用叭披,因為這個 App 使用了本篇文章中提到的技術方案進行了實現(xiàn)寥殖,實際效果歡迎...
- 實際操作的服務器是CentOS 6.x 64位系統(tǒng) 一嚼贡、配置防火墻 開啟80端口(nginx)、8080端口(sr...
- 最新一季的跑男第一期節(jié)目中有一個環(huán)節(jié),就是算算數(shù)題误窖,所有的人都茫然毫無頭緒掐场,只有關曉彤解出來了。于是成員紛紛封她...