![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
音视频
文章平均质量分 92
Dontla
调包侠
展开
-
RTSP视频流引用过多问题(RTSP播放失败、RTSP无法播放)解决办法
如果服务器的CPU、内存等硬件资源已经被现有的客户端使用到极限,那么新的客户端就无法再接入。具体来说,可以创建一个代理服务,它打开RTSP视频流并进行解码,然后其他服务可以从这个代理服务中获取解码后的数据。方法,或者如果代理服务的解码速度跟不上其他服务的处理速度,那么队列可能会变得非常大,消耗大量的内存。其次,可以调整服务器软件的设置,比如增大最大客户端连接数,或者优化编码参数以降低每个客户端的负载。方法在从队列中取出帧前检查队列是否为空,如果队列为空,则等待直到有新的帧到达或者超时为止。原创 2024-01-23 08:45:00 · 2761 阅读 · 0 评论 -
实时传输协议(RTP)介绍
实时传输协议 (RTP) 是一种重要的网络协议,它解决了实时音频和视频数据的网络传输问题。虽然 RTP 本身并不能保证数据的可靠传输,但是在大多数情况下,它都能提供满意的服务质量。同时,RTP 的设计也使得它可以很容易地与其他协议(如 RTCP)一起使用,以提供更完整的解决方案。原创 2024-01-21 00:15:47 · 1772 阅读 · 0 评论 -
ffmpeg RTMP推流参数介绍(rtmp参数)
FFmpeg是一个开源的音视频处理软件库,它包含了丰富的音视频编解码器、格式转换等工具。通过命令行接口,用户可以调用FFmpeg内置的众多功能,对音视频数据进行各种处理。RTMP是Adobe Systems公司开发的一种用于实时传输音频、视频和数据的协议。RTMP基于TCP,支持低延迟的数据交互,适合用于实时音视频流的传输。通过上述介绍,我们对FFmpeg在进行RTMP推流时所使用的参数有了详细的理解。实际使用中,可以根据具体需求和环境条件,灵活调整这些参数,实现音视频数据的高效传输。原创 2024-01-19 08:45:00 · 2139 阅读 · 0 评论 -
YouTube视频播放技术(视频网站原理)(Adaptive Bitrate Streaming, ABS 适应性比特率流技术)(Video On Demand, VOD 视频点播技术)
在现代互联网时代,视频内容已经成为人们日常生活的一部分。其中,YouTube作为全球最大的视频分享平台,提供了丰富的视频内容和高效的播放体验。本文将深入探讨YouTube视频播放背后的技术原理,包括视频上传、处理、编码、存储和传输等方面。原创 2024-01-18 09:15:00 · 1336 阅读 · 0 评论 -
Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)
本文详细介绍了如何搭建一个RTMP服务器,如何使用ffmpeg进行视频推流,以及如何使用VLC播放RTMP流。希望这些信息能够帮助你快速地实现视频推流和播放。原创 2024-01-17 00:23:24 · 7246 阅读 · 2 评论 -
RTMP推拉流服务器防盗链技术
"防盗链"是一种网络安全技术,主要用于防止资源被未经授权的用户访问。在RTMP服务中,防盗链通常通过在服务器端实现一些策略来实现,如Token校验、签名和时间戳等。原创 2024-01-17 09:30:00 · 1171 阅读 · 0 评论 -
Advanced Audio Coding (AAC) 音频编码格式介绍(改进离散余弦变换(MDCT)算法)频谱带复制(SBR)参数立体声(PS)
Advanced Audio Coding (AAC) 是一种由研究所、电信公司和广播机构的工程师组成的MPEG工作组(ISO/IEC JTC1/SC29/WG11)开发的数字音频压缩和编码标准。其设计初衷是作为MP3的后继者,以提供更好的声音质量。综上所述,AAC是一种非常强大且灵活的音频编码标准。其高效的编码算法、多通道支持以及各种扩展功能使其在音频压缩领域具有极高的竞争力。同时,其优秀的音质和低比特率性能也使得AAC被广泛应用在许多数字媒体平台和设备中。原创 2024-01-16 09:00:00 · 1205 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第四章:Fmpeg转码——FFmpeg输出MP3、FDK AAC编码、CBR、VBR、ABR、HE-AAC、HEv2-AAC
FFmpeg 从入门到精通日常生活中听音乐时大多数为 MP3 音乐,使用 FFmpeg 可以解码 MP3,同样 FFmpeg 也可以支持 MP3 编码, FFmpeg 使用第三方库 libmp3lame 即可编码 MP3 格式。不但如此,MP3 编码还是低延迟的编码,可以支持的采样率比较多,包含 44 100、48 000、32 000、22 050、24 000、16 000、11 025、12 000、8000 多种采样率,采样格式也比较多,包含 s32p (signed 32 bits, planar原创 2024-01-15 08:30:00 · 1225 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第四章:Fmpeg转码——ffmpeg硬编解码(硬件编解码)——Nvidia GPU、Intel QSV、树莓派、OS X
当使用 FFmpeg 进行软编码时,常见的基于 CPU 进行 H.264 或 H.265 编码其相对成本会比较高, CPU 编码时的性能也很低,所以出于编码效率及成本考虑,很多时候都会考虑采用硬编码,常见的硬编码包含 Nvidia GPU 与 Intel QSV 两种,还有常见的嵌入式平台,如树莓派、瑞芯微等,本节将重点介绍常见的 Nvidia 与 Intel 硬编码,以及树莓派的硬编码。原创 2024-01-15 09:00:00 · 3715 阅读 · 0 评论 -
Intel Quick Sync Video(QSV)(快速视频同步)介绍
Intel Quick Sync Video(QSV)是由Intel开发的专门用于视频编码和解码的技术。这项技术从Sandy Bridge微架构开始引入,自那时起,一直被集成在Intel的大多数桌面和移动处理器中。这项技术充分利用了内置在处理器中的专用媒体处理能力,提供了一种更快、更高效的方式来处理视频任务。使用QSV,可以大幅度减少CPU的负载,同时保持高质量的视频输出。原创 2024-01-14 08:30:00 · 2741 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第四章:Fmpeg转码——ffmpeg软编解码(软件编解码、Software Codec)
FFmpeg 从入门到精通参数全部为默认设置。关键帧(I帧)均匀分布在视频切片中的好处主要体现在两个方面:随机访问和搜索性能:每一个关键帧都是完全自我包含的,可以独立于其他帧进行解码。这意味着,如果你想跳转到视频中的某个特定时间点(例如,用户拖动进度条进行快进或者快退),播放器可以直接找到最近的关键帧开始播放,而无需从视频开头一路解码过来。因此,如果关键帧均匀地分布在视频中,将会提高视频的随机访问性能。错误恢复:如果视频流在传输过程中出现错误,丢失了一部分数据,那么从下一个关键帧开始原创 2024-01-13 13:17:30 · 1235 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第三章:FFmpeg转封装——视频文件切片;音视频流抽取;格式转换(封装转换)、编码转换的资源使用情况
只需要知道什么是切片,应用场景是什么,具体怎么切,用什么命令,这些都是相对来说没有那么重要的。原创 2024-01-13 12:28:46 · 1114 阅读 · 0 评论 -
NAL单元介绍(网络抽象层单元(Network Abstraction Layer Unit,简称NALU))(H.264/AVC或H.265/HEVC编码重要组成部分,用于封装视频数据和相关信息)
网络抽象层单元(Network Abstraction Layer Unit,简称NALU)是H.264/AVC或H.265/HEVC编码的重要组成部分。它用于封装视频数据和相关信息,并在网络中传输这些封装的单元。因为篇幅有限,我们能仅以H.264/AVC中的NALU作为案例来介绍。H.264/AVC是一种广泛使用的视频压缩标准,设计目标是以较低的比特率提供高质量的视频。它通过多种技术实现压缩效果,包括帧内预测、帧间预测、变换编码、环路滤波等。这些方法可以有效地减少视频的冗余信息,从而实现高效的压缩。原创 2024-01-10 09:45:00 · 1804 阅读 · 0 评论 -
AVCC(AVC Configuration)NALU封装格式介绍(一种描述H.264视频流信息的封装格式,包含了视频编码的关键元数据,是大多是MP4 H.264视频流的NALU封装格式)
AVCC (AVC Configuration) 是一种描述H.264视频流信息的格式,广泛用于MPEG-4和Flash视频中。这种封装方式使得解码器在处理视频数据之前能获取到关键的解码参数。在详细探讨AVCC封装格式之前,先了解一下H.264视频编码技术。H.264是一种常见的视频编码标准,也被称为MPEG-4 Part 10,或AVC(Advanced Video Coding)。它广泛应用于各种网络环境,从低速互联网连接到高清电视播放。原创 2024-01-10 09:15:00 · 1649 阅读 · 0 评论 -
AnnexB封装格式介绍(主要用于H.264和H.265视频编码标准,是一种常见的视频流NALU封装格式,常用于RTSP、RTP传输)
AnnexB是一种常见的封装格式,主要用于H.264和H.265视频编码标准。其特性包括插入开始代码以标识NAL单元的开始,以及使用字节流方式传输数据。原创 2024-01-08 23:34:38 · 1352 阅读 · 0 评论 -
视频文件切片介绍(视频切片)
通过将视频切片,可以按需加载和播放视频,而不需要一次性下载完整的视频文件,从而提高视频的加载速度和播放效率。原创 2024-01-09 09:15:00 · 4037 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第三章:FFmpeg转封装——视频文件转M3U8(转HLS)
M3U8 是一种常见的流媒体格式,主要以文件列表的形式存在,既支持直播又支持点播,尤其在 Android、iOS 等平台最为常用,下面就来看一下 M3U8 的最简单的例子:从这个例子中可以看到如下几个字段,其含义具体如下。可参考:ffmpeg转HLS参数介绍(ffmpeg转m3u8参数)原创 2024-01-08 09:45:00 · 1482 阅读 · 0 评论 -
ffmpeg转HLS参数介绍(ffmpeg转m3u8参数)
如果设置为0,那么将不再生成新的播放列表文件,而是覆盖旧的文件。此选项使得所有媒体数据都被写入一个单独的分段文件,同时生成一个与之配套的索引文件。这个参数对于某些特定场景非常有用,比如你希望继续一个已经存在的HLS流,并且不希望覆盖已经存在的切片。此选项强制每个分段文件都从新的关键帧开始,这样可以确保每个分段文件都可以独立解码。,它将生成一个"live"样式的播放列表,但如果新的分片被添加,旧的不会被删除。是输入文件的标志,后面紧跟着的是输入文件的路径。所设置的大小时,是否开始覆盖旧的分段文件。原创 2024-01-08 09:00:00 · 2473 阅读 · 0 评论 -
Docker nginx容器代理播放m3u8视频文件(HLS)
M3U8和HLS协议被广泛地支持,在各种设备和平台上都可以播放,包括iOS、Android、Windows、macOS等。因此,虽然在某些情况下,直接链接到视频文件可能更简单,但使用M3U8和HLS协议可以提供更强大和灵活的流媒体解决方案。:由于M3U8将媒体内容分割成多个小段,所以即使在下载过程中出现问题,也只会影响到当前的段,而不是整个视频。这个脚本将启动一个新的Docker容器,并映射主机的80端口到容器的80端口。:M3U8可以用于实时的流媒体广播,也可以用于点播内容。原创 2024-01-06 09:15:00 · 4203 阅读 · 3 评论 -
直播(Live Streaming)和点播(Video on Demand, VOD)概念(RTMP、RTSP、HLS、DASH、HPD)
与直播不同,点播的主要目标是提供高质量的音视频体验,以及丰富的用户交互性能(例如,暂停、快进、倒退等)。这些协议可以确保音视频数据的完整性,并且支持自适应比特率(ABR)技术,可以根据网络条件的变化动态调整视频质量,从而提供更好的用户体验。RTMP基于TCP,保证了数据的完整性,但由于TCP的重传机制,可能会导致延迟。请注意,同样的,播放DASH流也需要能够访问到MPD文件及其相关媒体文件的URL或路径,如果是在本地电脑上生成的DASH流,你可能需要运行一个HTTP服务器来提供访问。原创 2024-01-05 10:30:00 · 1415 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第三章:FFmpeg转封装——音视频转MP4、FLV——MP4格式标准、MP4 box列表
MP4 格式标准为 ISO-14496 Part 12、ISO-14496 Part 14 ,标准内容并不是特别多,下面就来着重介绍一些重要的信息。如果要了解 MP4 的格式信息,首先要清楚几个概念,具体如下。原创 2024-01-05 09:00:00 · 1139 阅读 · 0 评论 -
.m3u8播放列表文件(索引格式文件)、HLS(HTTP Live Streaming)协议介绍
M3U8 是一种基于 HTTP Live Streaming (HLS) 技术的媒体播放列表格式。这是一个非常重要的技术,因为它使得流媒体内容能够适应不同的网络状况和设备能力,从而实现无缝的在线视频体验。原创 2024-01-04 09:30:00 · 7897 阅读 · 0 评论 -
ISMV流媒体(Smooth Streaming Video)、ISML直播流(Smooth Streaming Live)、IIS服务器(Internet Information Services)
ISMV流中的关键技术点之一是其对带宽估计的准确性。为了实现这一目标,IIS使用了一种称为非阻塞I/O的技术,该技术允许服务器同时处理多个请求,而无需为每个请求分配一个单独的线程。ISMV(Smooth Streaming Video)是一种由微软开发的自适应比特率流式传输协议,它为客户端提供了连续流媒体播放,以便在网络条件变化时,可以无缝地切换到最合适的比特率。要创建一个ISML直播流,你需要一个能够生成H.264或VC-1编码的实时音视频源,以及一个能够将这些编码的音视频流封装成ISML格式的服务。原创 2024-01-04 08:15:00 · 1169 阅读 · 0 评论 -
Windows mp4info使用教程(提取MP4盒子信息、MP4 box信息、box分析工具、atom分析工具)
比我用xxd命令查看原始16进制数据方便多了。原创 2024-01-03 11:00:00 · 2674 阅读 · 0 评论 -
ElecardStreamEye使用教程(视频质量分析工具、视频分析)
它提供了对视频流的深度分析,包括宏块和帧级别的详细视觉表示。使用 “View -> Additional Info” 选项,可以选择展示每个 GOP(图像组)的平均码率、最大码率和最小码率。此外,StreamEye 还有一个强大的比较模式,可以同时打开和比较两个视频流。使用 “File -> Generate Report” 选项,StreamEye 可以生成详细的分析报告,包括所有参数和统计数据。Type处可以查看每一帧的类型(I帧、P帧或B帧)。我的版本是2.9.2,有点老,建议用最新的。原创 2024-01-03 10:15:00 · 6344 阅读 · 1 评论 -
BIFS流介绍(Binary Format for Scenes)(一种为交互式音频视觉内容设计的二进制格式,用于描述2D或3D场景的结构和行为)视频交互、视觉交互
BIFS(Binary Format for Scenes)是一种高效的,专为交互式音频视觉内容设计的二进制格式。在MPEG-4标准中,它被用于描述2D或3D场景的结构和行为。BIFS主要用于定义和管理富媒体对象及其交互性。它提供了对2D、3D图形以及音频的精细控制,包括动画、用户交互、事件驱动行为等。BIFS不仅能定义静态场景的初始化状态,而且能够描述场景中元素的动态变化。BIFS利用树状结构表示场景,其中每个节点代表一个媒体对象,如文本、2D/3D形状、音频流等。原创 2024-01-02 08:00:00 · 1032 阅读 · 0 评论 -
DASH切片介绍(Dynamic Adaptive Streaming over HTTP)(DASH协议:基于HTTP的自适应比特率流媒体传输协议)视频分段传输
DASH (Dynamic Adaptive Streaming over HTTP) 是一个基于HTTP的自适应比特率流媒体传输协议。在这篇文章中,我们将详细讨论其工作原理、主要特点以及如何实现。原创 2024-01-01 17:51:49 · 1560 阅读 · 0 评论 -
MP4文件中mvhd容器中的“下一个track ID”字段的作用是什么?(下一个轨道id)(新轨道id)
MP4文件由一系列"boxes"或者"atoms"构成,这些箱子组合起来描述了媒体的属性和结构。其中最重要的一个箱子就是’mvhd’(movie header box),它包含了关于整个电影和其各个轨道的全局信息。其中的一个重要字段就是"下一个track ID"。“下一个track ID”是一个32位无符号整数,它定义了将要创建的下一个轨道的唯一标识符。每次新建一个轨道时,这个值都会增加,以确保每个轨道在文件中有一个唯一的ID。每个轨道都有一个与之关联的唯一标识符,称为“轨道ID(Track ID)”。原创 2024-01-01 08:30:00 · 1089 阅读 · 0 评论 -
MP4容器结构英文缩写及英文全称(box结构、atom结构、MP4结构)
MP4文件格式是一个复杂的层级结构,下面列出了一些常见的容器及其英文全称和中文标注,方便查阅:ftyp (File Type Box):文件类型盒子moov (Movie Box):电影盒子mvhd (Movie Header Box):电影头部盒子原创 2023-12-31 17:02:53 · 1221 阅读 · 0 评论 -
Linux xxd命令分析视频文件Box教程(box分析box、视频box、分析atom分析)(xdd指令)
xxd命令是一个在Linux下将文件或输入转换为十六进制、二进制或ASCII表示的工具。这个命令对于分析二进制文件非常有用,尤其是当我们需要查看和理解文件内部结构的时候。以下是一些基本的xxd命令:xxd -r -p具体参考文章:linux xxd命令(查看文件内容、查看文件信息)(将文件或标准输入转换为hex(十六进制)和ASCII(美国信息交换标准代码)表示,或者从hex dump(十六进制转储)反向到二进制)原创 2023-12-31 09:30:00 · 1033 阅读 · 0 评论 -
MP4格式box、atom、fullbox、container box概念
ISO基础媒体文件格式 (ISOBMFF),定义在ISO/IEC标准14496-12中,是许多更具体的格式(如MP4,3GP,Motion JPEG 2000)的通用基础。本文将深入解析MP4的关键构成部分:Box、Atom、FullBox和Container Box,并揭示这些组件如何共同作用以实现复杂的多媒体编码。注意,这只是一个基础的解析器,它不会处理FullBox或Container Box,也不会解析任何特定类型的数据。Container Box是一种特殊的box,它的主要目的是包含其他box。原创 2023-12-27 08:15:00 · 1416 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg工具使用基础——第三节:ffplay常用命令
如果希望视频播放时播放器的窗口显示标题为自定义标题,则可以使用如下命令:ffplay -window_title “Hello World, This is a sample” output.mp4上述命令的显示窗口如图 2-4 所示。原创 2023-12-25 08:30:00 · 1240 阅读 · 0 评论 -
H.264运动补偿(Motion Compensation)概念(块匹配、运动矢量和残差编码、块划分和运动估计)(运动估计算法:全搜索、钻石搜索、六边形搜索)
H.264通过运动补偿技术有效地消除了视频帧之间的冗余信息,从而达到了高效的视频压缩效果。但与此同时,运动估计、残差编码等步骤也带来了一定的挑战。尽管如此,H.264依然是目前最广泛使用的视频压缩标准之一,其高效的压缩性能和灵活的编码选项使得它在各种应用场景中都有着广泛的应用。原创 2023-12-24 19:14:33 · 1773 阅读 · 0 评论 -
H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)
在视频压缩技术中,宏块是最基本的处理单元。每个宏块通常包含16x16的像素点,这些像素点共享某些参数,例如运动矢量和编码模式等。这种方式极大地减少了必须处理的数据量,同时也提高了编码效率1。原创 2023-12-24 18:06:03 · 1291 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第二节:ffprobe常用命令
从输出的内容可以看到,输出的信息为 FLAT 格式的输出,从 Packet 的 stream_ind ex 的值可以直接得知 Packet 属于哪个 Stream ,从而获得 Stream 对应的 Packet 的信息。从输出的内容可以看出,输出的内容格式为 XML 格式,如果原有的业务本身就可以解析 XML 格式,那么就不需要更改解析引擎,直接将输出内容输出为 XML 格式即可,解析引擎解 Packet 信息时会很方便。通过各种格式的输出,可以使用对应的绘图方式绘制出可视化图形。原创 2023-12-23 07:45:00 · 901 阅读 · 0 评论 -
ffmpeg教程笔记(C++ffmpeg库应用开发)命令行使用篇——第二章:FFmpeg 工具使用基础——第一节:ffmpeg常用命令
ffmpeg 在做音视频编解码时非常方便,所以在很多场景下转码使用的是 ffmpeg ,通过 `ffmpeg -help` 可以看到 ffmpeg 常见的命令大概分为6个部分,具体如下。- ffmpeg 信息查询部分- 公共操作参数部分- 文件主要操作参数部分- 视频操作参数部分- 音频操作参数部分- 字幕操作参数部分原创 2023-12-20 08:45:00 · 1519 阅读 · 0 评论 -
ffmpeg ffprobe FRAME字段解析(best_effort_timestamp_time、pix_fmt、sample_aspect_ratio、pict_type等)
在数据流处理中,如果一个系统标记"best_effort_timestamp",那可能意味着它尝试为每个接收到的数据包分配一个时间戳,但由于各种原因(比如网络延迟或系统繁忙),这个时间戳可能并不完全准确。除了关键帧(I帧)之外,还包括P帧和B帧。在视频压缩编码中,关键帧(也被称为I帧)是完整的图像帧,不依赖其他帧就可以独立解码。则提供了更多关于帧类型的信息,包括是否为P帧或B帧。在此例中,它是’yuv420p’,这意味着使用了4:2:0的色度子采样。在此例中,它是"video",表明这是一个视频帧。原创 2023-12-19 07:30:00 · 1400 阅读 · 0 评论 -
ffmpeg ffprobe FORMAT字段解析(nb_streams、nb_programs、format_name、format_long_name、bit_rate、probe_score等)
FFprobe是一款强大的媒体分析工具,它能提供多种形式的详细信息,包括但不限于流信息、元数据、帧信息等。在本文中,我们将侧重探讨其FORMAT字段的解析,以理解其每个属性对视频文件特性的含义。在多路复用的传输流中,程序是一种组织形式,将多个相关的音频、视频和数据流组合在一起。这是一个浮点数类型的字段,指示了文件的开始播放时间。这是一个整数类型的字段,指示了文件的平均比特率。这是一个字符串类型的字段,列出了所有可能的格式名称,以逗号分隔。字段表示文件的名称,这是一个字符串类型的字段,表明了被检查的文件名。原创 2023-12-18 22:28:15 · 1168 阅读 · 0 评论 -
linux xxd命令(查看文件内容、查看文件信息)(将文件或标准输入转换为hex(十六进制)和ASCII(美国信息交换标准代码)表示,或者从hex dump(十六进制转储)反向到二进制)
xxd是一个功能强大的工具,对于处理和分析二进制数据来说非常有用。尽管它的用法看起来可能有些复杂,但只需要理解了基本的操作和选项,就能够灵活地应对各种情况。原创 2023-12-18 21:57:39 · 2622 阅读 · 0 评论 -
ffmpeg ffprobe PACKET字段解读(codec_type、stream_index、pts_time、dts_time、convergence_duration_time)
在多媒体编码和传输中,packet(数据包)是指编码后的音频或者视频数据的最小单元。每个数据包都包含了一定数量的原始数据以及描述这些数据的元数据。这种分包方式方便对音视频数据进行传输、存储以及同步等操作。执行上述命令后,ffprobe会列出输入文件input.mp4的所有数据包信息(如果想从头开始看,可以用命令)。下面框选的是其中的一个数据包的元数据信息。原创 2023-12-18 08:30:00 · 1530 阅读 · 0 评论