`

FFMPEG类库打开流媒体的方法(需要传参数的时候)

 
阅读更多

使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input()。

其中打开网络流的话,前面要加上函数avformat_network_init()。

一般情况下,只要传入流媒体的url就可以了。但是在打开某些流媒体的时候,可能需要附加一些参数。

例如在播放中央人民广播电台的声音信号的时候,其url为“rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==”

如果直接进行打开是不会成功的,我们可以使用ffplay做一下实验:

 

ffplay rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==

会出现错误:

 

Invalid data found when processing input

这时候我们需要指定其传输方式为TCP,需要将命令改为如下形式:

 

ffplay -rtsp_transport tcp rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==

附加了参数以后,发现就可以正常播放了。

 

此外还可以附加一些参数,比如

 

ffplay -rtsp_transport tcp -max_delay 5000000 rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==


在使用FFMPEG类库进行编程的时候,如何将这些附加的参数传递给avformat_open_input()呢?经过研究后发现,可以通过AVDictionary把参数传给avformat_open_input()。

 

看一下avformat_open_input()的定义:

 

/**
 * Open an input stream and read the header. The codecs are not opened.
 * The stream must be closed with av_close_input_file().
 *
 * @param ps Pointer to user-supplied AVFormatContext (allocated by avformat_alloc_context).
 *           May be a pointer to NULL, in which case an AVFormatContext is allocated by this
 *           function and written into ps.
 *           Note that a user-supplied AVFormatContext will be freed on failure.
 * @param filename Name of the stream to open.
 * @param fmt If non-NULL, this parameter forces a specific input format.
 *            Otherwise the format is autodetected.
 * @param options  A dictionary filled with AVFormatContext and demuxer-private options.
 *                 On return this parameter will be destroyed and replaced with a dict containing
 *                 options that were not found. May be NULL.
 *
 * @return 0 on success, a negative AVERROR on failure.
 *
 * @note If you want to use custom IO, preallocate the format context and set its pb field.
 */
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);


可以看出avformat_open_input()的第4个参数是一个AVDictionary类型的参数。这个参数就是传入的附加参数。

 

设置AVDictionary的时候会用到av_dict_set()。

下面看看把命令

 

ffplay -rtsp_transport tcp -max_delay 5000000 rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==

 

转化为代码实现的方式:

 

AVFormatContext	*pFormatCtx;
pFormatCtx = avformat_alloc_context();
...代码略
AVDictionary *avdic=NULL;
char option_key[]="rtsp_transport";
char option_value[]="tcp";
av_dict_set(&avdic,option_key,option_value,0);
char option_key2[]="max_delay";
char option_value2[]="5000000";
av_dict_set(&avdic,option_key2,option_value2,0);
char url[]="rtsp://mms.cnr.cn/cnr003?MzE5MTg0IzEjIzI5NjgwOQ==";

avformat_open_input(&pFormatCtx,url,NULL,&avdic);



 

 

分享到:
评论

相关推荐

    MFC实现ffmpeg流媒体数据推送与接收(2.推流)

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现基于ffmpeg的流媒体数据推送。ffmpeg是一个强大的开源工具集,用于处理音视频数据,包括编码、解码、转码、流化等操作。MFC是微软提供的...

    winform利用ffmpeg给视频添加背景乐

    FFmpeg是一个强大的工具集,支持多种音视频编码、解码、转换以及流媒体操作。 首先,我们要了解FFmpeg的基本用法。FFmpeg通过命令行工具ffmpeg.exe执行各种操作,包括合并视频和音频。虽然直接调用命令行可以完成...

    c#基于FFMPEG的视频转码(视频转音频)

    C#项目可以创建一个封装FFMPEG功能的类库,通过方法调用来执行转码任务,这样就可以在.NET环境中方便地使用FFMPEG的强大功能。 视频转音频流程: 1. **初始化**:加载FFMPEG库,设置必要的全局配置,如错误处理和...

    ffmpeg csharp 封装

    在 C# 中封装 FFmpeg,通常会创建一个类库,提供一系列与 FFmpeg 对应的 API,如加载媒体文件、读取流、编码解码、格式转换等。这个过程涉及到以下关键知识点: 1. **P/Invoke 技术**:由于 FFmpeg 是用 C 语言编写...

    ffmpeg教程 C++ MFC VC

    - 结合FFmpeg,你需要创建一个C++类,该类负责与FFmpeg的接口交互,然后在MFC的视图或对话框类中调用这些方法。 4. **FFmpeg编码与解码** - 使用libavcodec进行编码和解码。例如,AVCodecContext是核心结构,用于...

    QT+FFmpeg实现音视频格式转换

    QT是一个强大的C++图形用户界面框架,而FFmpeg则是一个全面的音视频处理工具集,包含了解码、编码、转码、过滤和流媒体等功能。本文将详细介绍如何结合这两者来实现音视频格式的转换。 首先,理解QT的基本概念是...

    MFC+ffmpeg播放器

    2. **打开媒体文件**:使用avformat_open_input()打开媒体文件,avformat_find_stream_info()获取流信息。 3. **解码音视频流**:通过av_read_frame()读取一帧数据,avcodec_decode_video2()或avcodec_decode_audio...

    MFC FFmpeg DXVA2硬件解码实例

    FFmpeg则是一个开源的多媒体处理框架,包含了解码、编码、转换、流媒体等多种功能。FFmpeg支持多种视频编解码器,包括硬件加速的解码器,如DXVA2。 实现MFC与FFmpeg的结合,首先你需要在项目中集成FFmpeg库。这通常...

    MFC+FFMPEG非常简单的桌面视频录制及处理

    1. **FFmpeg的集成**:在VS2012环境下,首先需要下载FFmpeg源码并进行编译,生成所需的静态或动态链接库。然后将这些库文件添加到MFC项目的链接器设置中,确保编译时能正确链接FFmpeg库。 2. **录制功能**:利用...

    基于FFMPEG和SDL开发MFC视频播放器

    FFmpeg是一个全面的、跨平台的库,用于处理音视频数据,包括编码、解码、转码、流媒体等。而SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库,主要用于游戏开发,但也可用于创建图形用户界面和处理音频、...

    ffplaymfc-master.rar

    3. **处理事件**:当用户点击播放按钮时,调用FFmpeg的函数打开媒体文件,解码音视频流,并将解码后的数据传递给MFC的绘图函数进行渲染。 4. **时间同步**:由于音频和视频流可能有不同的帧率,需要同步音频和视频...

    视频格式转换C++实现思路

    在本文中,我们将深入探讨视频格式转换的C++实现方法,主要关注两种常见的技术途径:使用Windows.Media.Transcoding API和FFmpeg库。这两种方法各有特点,适用于不同的开发环境和需求。 首先,我们来看使用Windows....

    vc-mfc网络编程实例

    在VC++环境中,MFC(Microsoft Foundation Classes)库为开发者提供了强大的Windows应用程序开发框架,它包含了一套完整的类库,可以方便地实现图形用户界面、数据库访问、网络通信等功能。本篇文章将深入探讨如何...

    视频剪切程序

    - **遍历帧**:逐帧解码,检查是否在剪切范围内,将需要的帧保存到新的视频流中。 - **编码输出**:完成剪切后,使用库函数进行重新编码并保存为新视频。 5. **图形用户界面 (GUI)** - **MFC应用**:Microsoft ...

    C#开发典型模块大全之屏幕录像模块源代码

    源代码中可能会包含创建编码器实例,设置编码参数(如比特率、分辨率、帧率),以及将捕获的图像数据编码成视频流的代码。 接着,录制的视频流需要保存到文件中,这涉及文件I/O操作。C#的System.IO命名空间提供了...

    vb写的音频处理软件代码

    5. **类库和模块**:为了方便代码复用和管理,VB源代码可能包含了处理音频的类库或模块,比如一个AudioFile类,包含打开、关闭、播放、保存等方法。 6. **事件处理**:在VB中,事件驱动编程是常见的编程模式。例如...

    VB.programming.audio.video.capture.module.code.rar_Capture_vb vi

    视频捕获通常包括打开设备、设置捕获参数(如分辨率、帧率)、捕获帧到内存或文件,以及显示预览等步骤。Video for Windows (VFW) API也是一个早期的选择,但现在已经较少使用。 3. 模块化设计: 音视频采集模块...

    aforge_video_recording-master.zip

    因此,在实际应用中,开发者需要根据硬件资源和需求来调整参数,如降低帧率、压缩质量等,以保证录制过程的流畅性。 6. **实例代码** 下面是一个简单的使用AForge.VideoRecording录制视频的C#代码示例: ```...

    AudioEncoder_Console

    在现代数字媒体处理中,音频编码扮演着至关重要的角色。本文将围绕“AudioEncoder_Console”项目,详细探讨使用C#语言开发音频编码器控制台应用程序的核心技术和实现原理。这个项目提供了一个基础平台,让我们深入...

Global site tag (gtag.js) - Google Analytics