android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...
Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)
项目地址
https://github.com/979451341/RtmpSave
这个项目主要代码我是从雷神那弄过来的, 不愧是雷神, 我就配个环境搞个界面就可以用代码了
这一次说的是将 RTMP 流媒体保存成为一个本地的 FLV 文件因为播放视频本身占有很多技术难点, 我先不做边获取 RTMP 流边播放了, 这一次主要说如何获取 RTMP 流
说说代码
初始化组件和网络环境av_register_all();
//Network
avformat_network_init();
打开 RTMP 流, 获取 RTMP 流的信息, 并搜索到其中视频流的位置//Input
if((ret=avformat_open_input(&ifmt_ctx,in_filename,0,0))<0){
printf("Could not open input file.");
gotoend;
}
if((ret=avformat_find_stream_info(ifmt_ctx,0))<0){
printf("Failed to retrieve input stream information");
gotoend;
}
for(i=0;inb_streams;i++)
if(ifmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
videoindex=i;
break;
}
将 RTMP 流的一些配置信息保存在输入环境信息
av_dump_format(ifmt_ctx, 0, in_filename, 0);
根据输出 flv 文件名称和路径得到输出环境信息avformat_alloc_output_context2(&ofmt_ctx,NULL,NULL,out_filename);//RTMP
if(!ofmt_ctx){
printf("Could not create output context\n");
ret=AVERROR_UNKNOWN;
gotoend;
}
把输出环境信息的输出格式信息保存在 ofmt
ofmt = ofmt_ctx->oformat;
创建一条输出环境信息的流, 就将输如环境信息里一条流复制到其中, 并对每一条流的编码做出配置for(i=0;inb_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;
gotoend;
}
//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");
gotoend;
}
out_stream->codec->codec_tag=0;
if(ofmt_ctx->oformat->flags&AVFMT_GLOBALHEADER)
out_stream->codec->flags|=CODEC_FLAG_GLOBAL_HEADER;
}
调试函数
av_dump_format(ofmt_ctx, 0, out_filename, 1);
打开输出 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);
gotoend;
}
}
向输出环境写入文件头部//Write file header
ret=avformat_write_header(ofmt_ctx,NULL);
if(ret<0){
printf("Error occurred when opening output URL\n");
gotoend;
}
配置 H264 编码器#if USE_H264BSF
AVBitStreamFilterContext*h264bsfc=av_bitstream_filter_init("h264_mp4toannexb");
#endif
开始循环读帧写入 flv 文件
读取一帧 RTMP 流的视屏流数据ret=av_read_frame(ifmt_ctx,&pkt);
if(ret<0)
break;
计算对应这一帧输入 RTMP 流数据的一帧输出数据的相关显示帧时间 pts, 解码帧时间 dts, 距离上一帧到下一帧的播放时间差距 durationpkt.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);
根据 H264 编码格式转换一帧输出数据#if USE_H264BSF
av_bitstream_filter_filter(h264bsfc,in_stream->codec,NULL,&pkt.data,&pkt.size,pkt.data,pkt.size,0);
#endif
将这一帧输出数据写入 flv 文件, 然后释放这一帧数据ret=av_interleaved_write_frame(ofmt_ctx,&pkt);
if(ret<0){
printf("Error muxing packet\n");
break;
}
av_free_packet(&pkt);
关闭 H264 编码器#if USE_H264BSF
av_bitstream_filter_close(h264bsfc);
#endif
释放输入输出环境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);
if(ret<0&&ret!=AVERROR_EOF){
printf("Error occurred.\n");
return-1;
}
说说 app 的使用
那个点击 button 就可以了, 点击后它会字样会变成 started, 这样他就在保存 RTMP 流文件了, 过一两分钟就相应路径去看就可以了
来源: http://blog.csdn.net/z979451341/article/details/79409134
android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...相关推荐
- Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)
项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒 ...
- Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)
本篇项目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/AudioRecord ...
- html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)
文章目录 1.功能模板 1.1 仿爱奇艺 1.2 仿搜狐视频 1.3 仿迅雷看看 1.4 视频播放 1.5 影视公司官网 2.效果和源码 2.1 源代码 2.2 模板目录 源码下载 作者:xcLeig ...
- Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...
- Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接
Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...
- Android 统一打包框架(附源码下载)
唠叨: 把手给我,我带你去吃云浮吃石磨肠粉.云吞面,木瓜渣. 那里的肠粉和广州的不一样,皮很薄很滑,肉馅没广州的那么花里胡哨,只有肉碎和香葱.但吃起来就很香滑,再配上它的甜辣酱.那味道好极了. 云吞面 ...
- Android可滑动画板,Android实现画板、写字板功能(附源码下载)
前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...
- php写字板代码,Android实现画板、写字板功能(附源码下载)
前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...
- Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)
本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...
最新文章
- linux内核 asmlinkage宏
- GO 输出字符数同时输出这个字符串的字节数
- Nginx日志文件的切割
- 图片保存路径更改 python
- for循环中执行setTimeout问题(任务队列的问题)
- Enums and Structs in C#(C#里的枚举和结构) (from codeproject)
- 硬件:固态硬盘SSD的基础知识及安装注意事项!
- 图解利用栈实现递归函数的非递归计算
- 【讨论】初学者拿到2440、6410 等开发板应该怎么学习?
- 基础篇5-python基本数据类型讲解1.1
- Perl 模块 Getopt::Std 和 Getopt::Long
- vi编辑器 常用命令汇总
- java如何准确的读取多音字
- [生存志] 第72节 夫差许越称臣
- Unity个人游戏开发总结
- html文字浮雕效果不起作用,ps浮雕效果 怎么把文字弄成浮雕效果
- 简单的酒店住房退房管理系统
- Android再进阶之广播发送、接收和注册过程
- 总结:线程间频繁切换为什么耗费资源?
- 一个淘宝店主真实的开店经历