热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FFMPEG之RTSP获取H264/H265裸流保存文件

参考:https:blog.csdn.netweixin_42432281articledetails883481241目标背景本文的目的是实现linux嵌入式端f

参考:https://blog.csdn.net/weixin_42432281/article/details/88348124

1 目标背景
本文的目的是实现linux嵌入式端ffmpeg读取网络相机rtsp码流,不经过编解码操作,直接保存为视频文件,ffmpeg有命令的形式可以实现(参考《FFmpeg功能命令汇总》),但是无法灵活设置,而且调用起来也不方便,因此直接使用源码编译,提供功能接口

2 RTSP与H264
通常所说的rtsp协议其实包含三个协议: rtsp协议, rtp协议, rtcp协议。各协议运作流程概要:

第一阶段:rtsp协议负责沟通传输什么数据,传的是图像还是声音,还是两者混合?图像的话传是h264流,还是h265流,还是jpeg流?后续的rtp,rtcp协议是采用tcp还是udp,端口号是多少都是通过第一阶段的rtsp协议确定的。

第二阶段:通过rtp协议传输数据,rtcp进行网络传输质量的监控

第三阶段:通过rtsp协议中断整个协议的传输

3 ffmpeg安装
首先先将设备上的ffmpeg卸载干净,防止后续出错

sudo apt-get remove ffmpeg x264
sudo apt-get autoremove

3.1 x264安装
因为要保存成h264文件,需要有h264编解码器,安装ffmpeg的时候也必须要选择支持x264

git clone https://code.videolan.org/videolan/x264.git
cd x264
//如果git指令下载速度特别慢的话,可以在下边链接里下载压缩包
//https://www.videolan.org/developers/x264.html
./configure --enable-shared --enable-static --prefix=/usr/local
sudo make
sudo make install

3.2 x265安装
依次按照如下指令,注意由于我是在arm嵌入式板子上安装的,所以第3步选择的是arm-linux,自己要结合实际情况来选择,后续的操作方法是一样的

sudo apt-get install mercurial cmake cmake-curses-gui build-essential yasm
hg clone https://bitbucket.org/multicoreware/x265
cd x265/build/arm-linux
sudo sh ./make-Makefiles.bash
# 要把PIC选项打开,见下图,按下“g”退出
sudo make
sudo make install

在这里插入图片描述
3.3 ffmpeg安装
这里推荐采用源码安装,网上很多人推荐的apt安装方式装完之后,有些文件和文件夹找不到,使用源码安装,可以自己配置安装路径,更适合我们源码开发

下载地址:https://ffmpeg.org

下载后解压,使用如下指令安装

./configure --enable-libx264 --enable-libx265 --enable-shared --enable-gpl --prefix=/usr/local
sudo make
sudo make install

安装完后运行ldd which ffmpeg 查看ffmpeg的库是否可以找到

这时一般会打印为:


linux-gate.so.1 => (0x00f90000)
libavdevice.so.52 => not found
libavfilter.so.1 => not found
libavformat.so.52 => not found
libavcodec.so.52 => not found
libpostproc.so.51 => not found
libswscale.so.0 => not found
libavutil.so.50 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0x00821000)
libm.so.6 => /lib/libm.so.6 (0x007da000)
libc.so.6 => /lib/libc.so.6 (0x0067b000)
/lib/ld-linux.so.2 (0x0065c000)


而命令find /usr/local/lib/ | grep -E “libavdevice.so.52|libavfilter.so.1|libavcodec.so.52|libavcore.so.0”

通常会打印输出


/usr/local/lib/libavdevice.so.52.5.0 /usr/local/lib/libavfilter.so.1
/usr/local/lib/libavdevice.so.52 /usr/local/lib/libavfilter.so.1.80.0
/usr/local/lib/libavcodec.so.52.123.0 /usr/local/lib/libavcodec.so.52


说明你有这些库,只是没有识别。当然,路径/usr/local/lib 和/usr/local/include主要是因为ffmpeg的安装前缀是/usr/lcoal,好像用户安装linux的软件默认都是这里。把ffmpeg库路径加入环境变量

sudo vi /etc/ld.so.conf
/usr/local/lib //在文本后边添加该路径
sudo ldconfig //执行ldconfig立即生效

4 实现源码
新建一个文件video2h264.c,内容如下

#include
#include #ifdef __cplusplus
extern "C"
{
#endif
/*Include ffmpeg header file*/
#include
#include
#include #include
#include
#include
#include
#ifdef __cplusplus
}
#endifvoid main()
{AVFormatContext *pFormatCtx;char filepath[] &#61; "rtsp://admin:jiaxun123&#64;192.168.170.248:554/h264/ch1/main/av_stream";AVPacket *packet;//初始化av_register_all();avformat_network_init();pFormatCtx &#61; avformat_alloc_context();AVDictionary* options &#61; NULL;av_dict_set(&options, "buffer_size", "1024000", 0); //设置缓存大小,1080p可将值跳到最大av_dict_set(&options, "rtsp_transport", "tcp", 0); //以udp的方式打开,av_dict_set(&options, "stimeout", "5000000", 0); //设置超时断开链接时间&#xff0c;单位usav_dict_set(&options, "max_delay", "500000", 0); //设置最大时延packet &#61; (AVPacket *)av_malloc(sizeof(AVPacket));//打开网络流或文件流if (avformat_open_input(&pFormatCtx, filepath, NULL, NULL) !&#61; 0){printf("Couldn&#39;t open input stream.\n");return;}//查找码流信息if (avformat_find_stream_info(pFormatCtx, NULL)<0){printf("Couldn&#39;t find stream information.\n");return;}//查找码流中是否有视频流int videoindex &#61; -1;unsigned i &#61; 0;for (i &#61; 0; i<pFormatCtx->nb_streams; i&#43;&#43;)if (pFormatCtx->streams[i]->codec->codec_type &#61;&#61; AVMEDIA_TYPE_VIDEO){videoindex &#61; i;break;}if (videoindex &#61;&#61; -1){printf("Didn&#39;t find a video stream.\n");return;}//保存一段的时间视频&#xff0c;写到文件中FILE *fpSave;fpSave &#61; fopen("geth264_test.h264", "wb");for (i &#61; 0; i < 20000; i&#43;&#43;) //这边可以调整i的大小来改变文件中的视频时间{if (av_read_frame(pFormatCtx, packet) >&#61; 0){if (packet->stream_index &#61;&#61; videoindex){fwrite(packet->data, 1, packet->size, fpSave); }av_packet_unref(packet);}}fclose(fpSave);av_free(pFormatCtx);//av_free(packet);av_packet_unref(packet);
}

编译指令

gcc video2h264.c -o ffmpegtest -lpthread -lm -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswresample -lswscale -lrt -lx264 -ldl

如果编译时报错如下


In file included from /usr/local/include/libavutil/avutil.h:296:0,
from /usr/local/include/libavutil/samplefmt.h:24,
from /usr/local/include/libavcodec/avcodec.h:31,
from video2mp4.cpp:5: /usr/local/include/libavutil/common.h:31:2: error: #error missing
-D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS In file included from /usr/local/include/libavutil/avutil.h:296:0,
from /usr/local/include/libavutil/samplefmt.h:24,
from /usr/local/include/libavcodec/avcodec.h:31,
from video2mp4.cpp:5: /usr/local/include/libavutil/common.h: In function ‘int32_t
av_clipl_int32_c(int64_t)’:
/usr/local/include/libavutil/common.h:209:47: error: ‘UINT64_C’ was
not declared in this scope


则需要修改common.h文件&#xff0c;运行

sudo vi /usr/local/include/libavutil/common.h

在在#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS前面前边添加如下

#if defined __cplusplus
#define __STDC_CONSTANT_MACROS
#endif#ifndef UINT64_C
#define UINT64_C(value) __CONCAT(value, ULL)
#endif

推荐阅读
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 在本地环境中调试远程服务器上的网站代码执行问题,可以通过以下步骤实现:首先,在本地安装 Visual Studio 并配置远程调试工具。接着,确保服务器和本地机器之间的网络连接畅通,并正确设置防火墙规则以允许调试流量。最后,使用 Visual Studio 的远程调试功能连接到服务器,进行代码调试。这种方法不仅提高了开发效率,还减少了在服务器上直接操作的风险。 ... [详细]
  • 深入浅出 webpack 系列(二):实现 PostCSS 代码的编译与优化
    在前一篇文章中,我们探讨了如何通过基础配置使 Webpack 完成 ES6 代码的编译。本文将深入讲解如何利用 Webpack 实现 PostCSS 代码的编译与优化,包括配置相关插件和加载器,以提升开发效率和代码质量。我们将详细介绍每个步骤,并提供实用示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • Linux基础知识:Vi与Vim编辑器详解
    Linux基础知识:Vi与Vim编辑器详解 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 基于Linux系统的Kickstart自动化服务器部署方案
    本文针对企业需求,提出了一种基于Linux系统的Kickstart自动化服务器部署方案。该方案旨在通过无盘批量安装操作系统,提高企业IT基础设施的部署效率。Kickstart是一种利用Anaconda工具实现服务器自动化安装的技术,能够显著简化和加速操作系统的安装过程。通过详细的实施规划,本文介绍了Kickstart的工作原理及其在实际部署中的应用,为企业提供了高效的自动化部署解决方案。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
author-avatar
水门街口卖瓜子的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有