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 (附源码下载)...相关推荐

  1. Android 音视频深入 十七 FFmpeg 获取RTMP流保存为flv (附源码下载)

    项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码我是从雷神那弄过来的,不愧是雷神,我就配个环境搞个界面就可以用代码了. 这一次说的是将RTMP流媒 ...

  2. Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)

    本篇项目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/AudioRecord ...

  3. html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

    文章目录 1.功能模板 1.1 仿爱奇艺 1.2 仿搜狐视频 1.3 仿迅雷看看 1.4 视频播放 1.5 影视公司官网 2.效果和源码 2.1 源代码 2.2 模板目录 源码下载 作者:xcLeig ...

  4. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

  5. Android 利用广播实现黑名单【指定号码】的短信的拦截 附源码下载链接

    Android 利用广播实现指定号码的短信的拦截 根据最近的学习内容,今天实现了利用广播进行指定号码的拦截 步骤: ①.写一个数据库的帮助类,实现对数据库的创建,总共创建两个数据库psms(受保护的短 ...

  6. Android 统一打包框架(附源码下载)

    唠叨: 把手给我,我带你去吃云浮吃石磨肠粉.云吞面,木瓜渣. 那里的肠粉和广州的不一样,皮很薄很滑,肉馅没广州的那么花里胡哨,只有肉碎和香葱.但吃起来就很香滑,再配上它的甜辣酱.那味道好极了. 云吞面 ...

  7. Android可滑动画板,Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...

  8. php写字板代码,Android实现画板、写字板功能(附源码下载)

    前言 本文给大家分享一个使用Android开发写字板功能Dem.简单操作内存中的图像.对图像进行简单的处理.绘制直线.以达到写字板的效果 效果图如下 XML布局代码 xmlns:tools=" ...

  9. Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

    本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击 ...

最新文章

  1. linux内核 asmlinkage宏
  2. GO 输出字符数同时输出这个字符串的字节数
  3. Nginx日志文件的切割
  4. 图片保存路径更改 python
  5. for循环中执行setTimeout问题(任务队列的问题)
  6. Enums and Structs in C#(C#里的枚举和结构) (from codeproject)
  7. 硬件:固态硬盘SSD的基础知识及安装注意事项!
  8. 图解利用栈实现递归函数的非递归计算
  9. 【讨论】初学者拿到2440、6410 等开发板应该怎么学习?
  10. 基础篇5-python基本数据类型讲解1.1
  11. Perl 模块 Getopt::Std 和 Getopt::Long
  12. vi编辑器 常用命令汇总
  13. java如何准确的读取多音字
  14. [生存志] 第72节 夫差许越称臣
  15. Unity个人游戏开发总结
  16. html文字浮雕效果不起作用,ps浮雕效果 怎么把文字弄成浮雕效果
  17. 简单的酒店住房退房管理系统
  18. Android再进阶之广播发送、接收和注册过程
  19. 总结:线程间频繁切换为什么耗费资源?
  20. 一个淘宝店主真实的开店经历

热门文章

  1. Simulink_simscape电源电路建模入门
  2. Dell 一体机的第二硬盘(ssd)突然不能启动的处理方法
  3. 使用 Python 进行 GUI 掷骰子模拟
  4. LTS分布式任务调度文档
  5. 天灵灵地灵灵,送走Live Messenger的广告,快显灵
  6. WinSCP连接linux系统root登录时拒绝访问解决办法
  7. 7-2 阶梯电价 (15 分)
  8. Google英语伪原创:优缺点分析
  9. 「GoCN酷Go推荐」使用gops诊断运行中的go程序
  10. 2020年7月最新加速下载百度网盘文件方法