文档库 最新最全的文档下载
当前位置:文档库 › ffmpeg 转码总结

ffmpeg 转码总结

ffmpeg 转码总结
ffmpeg 转码总结

FFmpeg 转码总结

转码参数

输入、输出音频、视频编码器、码率、是否帧内压缩

转码流程

一、处理输入文件

1.处理输入文件打开输入文件,获取文件内的流信息

2.初始化AVFormatContext

AVFormatContext* ic = avformat_alloc_context();

3.打开输入文件,获取流信息

av_open_input_file(&ic, filename, NULL, 0, NULL);

如果成功,ic中包含了输入文件的流信息

二、处理输出文件

1.初始化 AVFormatContext

AVFormatContext* oc = avformat_alloc_context();

2.设置输入文件的名称

av_strlcpy(oc->filename,filename,sizeof(oc->filename));

3.给输出文件增加视频流

新建一个流

AVStream *st = av_new_stream(oc, oc->nb_streams);

4.设置视频编码器的相关参数

编码线程,最小为1

avcodec_thread_init(st->codec, thread_count);

5.设置编码器

codec_id=find_codec_or_die(video_codec_name,CODEC_TYPE_VIDEO,1) AVCodec*codec = avcodec_find_encoder((CodecID)codec_id);

AVCodecContext *video_enc = st->codec;

Video_enc->codec_type = CODEC_TYPE_VIDEO;

Video_enc->codec_id = (CodecID)codec_id;

//设置帧率 25帧每秒

video_enc->time_base.den = 25;

video_enc->time_base.num = 1;

设置视频宽高

video_enc->width = 576;

video_enc->height = 420;

设置显示横宽比 4:3

video_enc->sample_aspect_ratio.num = 4;

video_enc->sample_aspect_ratio.den = 3;

如果帧内编码

video_enc->gop_size = 0;

给输出文件增加音频流

新建一个音频流

AVStream *st = av_new_stream(oc, oc->nb_streams);

audio_enc = st->codec;

audio_enc->codec_type = CODEC_TYPE_AUDIO;

设置音频编码器

codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1);

audio_enc->codec_id = (CodecID)codec_id;

设置音频参数

audio_enc->thread_count = thread_count;

audio_enc->channels = audio_channels;

audio_enc->channel_layout = channel_layout;

const enum SampleFormat *p= codec->sample_fmts;

for(; *p!=-1; p++){

if(*p == audio_enc->sample_fmt)

break;

}

if(*p == -1)

audio_enc->sample_fmt = codec->sample_fmts[0];

audio_enc->sample_rate = audio_sample_rate;

audio_enc->time_base.num = 1;

audio_enc->time_base.den = audio_sample_rate;

三、打开编码器和解码器

1.avcodec_open(st->codec, codec)

2.写输出文件的头信息

av_write_header(os)

3.循环读取每一帧

av_read_frame(is, &pkt)

4.计算pts与dts

pkt.dts+= av_rescale_q(input_files_ts_offset[ist->file_index],

m_AV_Time_Base_Q, ist->st->time_base);

pkt.pts+= av_rescale_q(input_files_ts_offset[ist->file_index],

m_AV_Time_Base_Q, ist->st->time_base);

5.帧解码

音频:avcodec_decode_audio2(ist->st->codec, samples,

&data_size,ptr, len);

视频:avcodec_decode_video(ist->st->codec, &picture, &got_picture, ptr, len);

音频重新编码:avcodec_encode_audio(enc, audio_out,

audio_out_size,(short *)audio_buf);

视频编码:

ret = avcodec_encode_video(enc,

bit_buffer, bit_buffer_size,

&big_picture);

6.写入输出文件

av_interleaved_write_frame(s, pkt);

7.写输出文件结束信息

av_write_trailer(os);

ffmpeg开发指南(使用 libavformat 和 libavcodec)

ffmpeg开发指南(使用libavformat 和libavcodec) ffmpeg开发指南(使用libavformat 和libavcodec) ffmpeg开发指南(使用libavformat 和libavcodec)Ffmpeg 中的Libavformat 和libavcodec库是访问大多数视频文件格式的一个很好的方法。不幸的是,在开发您自己的程序时,这套库基本上没有提供什么实际的文档可以用来作为参考(至少我没有找到任何文档),并且它的例程也并没有太多的帮助。这种情况意味着,当我在最近某个项目中需要用到libavformat/libavcodec 库时,需要作很多试验来搞清楚怎样使用它们。这里是我所学习的--希望我做的这些能够帮助一些人,以免他们重蹈我的覆辙,作同样的试验,遇到同样的错误。你还可以从这里下载一个demo程序。我将要公开的这部分代码需要0.4.8 版本的ffmpeg库中的 libavformat/libavcodec 的支持(我正在写最新版本)。如果您发现以后的版本与我写的程序不能兼容,请告知我。在这个文档里,我仅仅涉及到如何从文件中读入视频流;音频流使用几乎同样的方法可以工作的很好,不过,我并没有实际使用过它们,所以,我没于办法提供任何示例代码。或许您会觉得奇怪,为什么需要两个库文件libavformat 和libavcodec :许多视频文件格式(AVI就是一个最好的例子)

实际上并没有明确指出应该使用哪种编码来解析音频和视 频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑定在一个文件里面。这就是为什么有时候,当你打开了一个AVI文件时,你只能听到声音,却不能看到图象--因为你的系统没有安装合适的视频解 码器。所以,libavformat 用来处理解析视频文件并将包含在其中的流分离出来,而libavcodec 则处理原始音频和视频流的解码。打开视频文件: 首先第一件事情--让我们来看看怎样打开一个视频文件 并从中得到流。我们要做的第一件事情就是初始化libavformat/libavcodec:av_register_all(); 这一步注册库中含有的所有可用的文件格式和编码器,这样当打开一个文件时,它们才能够自动选择相应的文件格式和编码器。要注意你只需调用一次av_register_all(),所以,尽可能的在你的初始代码中使用它。如果你愿意,你可以仅仅注册个人的文件格式和编码,不过,通常你不得不这么做却没有什么原因。下一步,打开文件: AVFormatContext *pFormatCtx;

视频直播系统设计与实现

龙源期刊网 https://www.wendangku.net/doc/ab12594694.html, 视频直播系统设计与实现 作者:高春雷 来源:《科技风》2016年第18期 摘要:本文研究了视频直播系统的设计,并基于ffmpeg、vlc和EasyDarwin开源软件进 行了二次开发,简单而有效地实现了该设计,具有较强的工程参考价值。 关键词:视频直播系统;ffmpeg;vlc;EasyDarwin 随着社会的发展,视频直播系统或者监控系统在场馆、学校、车载等场景中的应用越来越广泛。例如很多的幼儿园开始把监控系统作为辅助设备,也是幼儿园智能化管理的新趋势。本文研究了一种易于实现的视频直播系统。 一、系统设计 本系统主要由视频采集装置、推流服务器、流媒体服务器和视频监控设备构成。视频采集装置主要为摄像头。由于整个系统需要在不同的区域进行布防和监控,以幼儿园为例,其主要公共场所包括教室、活动区和出入口等,针对不同区域的实际情况安置不同类型的摄像机,公共活动区适合安装可调视角的球机,而楼道等可安装枪机。流媒体是指以流的方式在网络中传送视频、音频的媒体形式。流媒体服务器以TP/RTSP、MMS、RTMP等流式协议把视频文件传输到视频监控设备;流媒体服务器也可从视频采集装置接收实时的视频流,再以流式协议直播给视频监控设备。对于某些应用场景视频采集设备处于内网,不能直接和处于外网的流媒体服务器进行通讯。此时就需要推流服务器将内网设备所采集的视频推流到流媒体服务器。视频监控中设备可对所需区域进行有效的监控,可以包括电视墙显示系统等。此外,视频监控中心可扩展视频截屏录像、用户权限等功能。 二、系统实现 基于上述设计思路,本文采用开源软件快速实现简单的RTSP直播系统。系统采用ffmpeg 作为推流服务器将视频采集装置的视频流推送到流媒体服务器,EasyDarwin作为流媒体服务 器转发ffmpeg推送过来的视频流。视频监控设备的客户端采用VLC播放。实现过程如下: 1)部署EasyDarwin流媒体服务器。EasyDarwin基于Apple开源项目开发、优化的流媒体服务器,支持RTSP点播、直播(推拉模式)、HLS直播等功能。编译好EasyDarwin后需要在easydarwin.xml文件中对其进行设置。本文实验过程中将EasyDarwin流媒体服务器部署在127.0.0.1,端口:554。在控制台中启动服务,启动命令为:EasyDarwin.exe -d - c ./easydarwin.xml。 2)ffmpeg推送视频到EasyDarwin。FFmpeg可以用来记录、转换数字音频、视频,并能将其转化为流。FFmpeg开发于Linux平台,但它可在Windows、Mac OS X等操作系统环境中

视频解码中用到的ffmpeg交叉编译技巧

视频解码中用到的ffmpeg交叉编译技巧 一、简介 FFmpeg是一个集录制,转换,音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。 由于ffmpeg是基于linux开发的,源代码和windows下最常见的visual studio提供的c/c++编译器不兼容,因此不能直接使用msvc++编译,想要使用ffmpeg,需要在windows下配置一个类似Linux 的编译环境,并将ffmpeg编译为二进制库以后,再利用其进行进一步开发。 目前,windows下可直接使用的最新版本是由ffmpeg工程组,于2008年4月份发布的ffmpeg full sdk v3.2。该sdk尽可能的集成了更多的编解码器。 在应用中,使用该开发包存在2个缺陷,第一,该sdk编译基于ffmpeg r12790,编解码效率上,当前已经有了较大的提升;第二,该开发包包含了很多不需要的编解码器,需要尽可能减少开发包的体积及关联的库的个数。基于以上需求,需要自己编译出windows下可用动态库及静态库。 使用到的库文件有4个,libavcodec,libavformat,libavutil,libswscale,其中库 libavcodec,libavformat用于对媒体文件进行处理,如编解码;libavutil是一个通用的小型函数库,该库中实现了CRC校验码的产生,128位整数数学,最大公约数,整数开方,整数取对数,内存分配,大端小端格式的转换等功能,libswscale主要用于图像格式转换及缩放。因效率的需要,我们选择了 ffmpeg-mt版本,同时通过配置编译尽量减少相关文件的体积。 网上类似编译过程说明较多,但实际编译过程中碰到一些问题,这些问题的解决花费了不少时间,本文档对这一过程进行记录,以便后续维护及学习。 二、编译环境搭建 windows下ffmpeg编译环境有多种可选择方案。这里我们使用MinGW+MSYS。 1.下载mingw+msys并安装 https://www.wendangku.net/doc/ab12594694.html,/projects/mingw/ mingw,默认安装,在choose components时选择g++ compiler及MinGW Make Msys,默认安装, Do you wish to continue with the post install【yn】,y! Do you have mingw installed?【yn】,y Where is your mingw installation? C:/mingw

课题_基于VLC的播放器开发

VLC的C++封装 因为工作需要,研究了一段时间的播放器开发,如果从头开始做,可以学习下FFmpeg,很多播放器都是基于FFmpeg 开发的,但是这样工作量和难度都比较大,如果想很快能拿出一个播放器来用的,可以研究下开源的播放器,参考下射手播放器作者的文章:媒体播放器三大底层架构。 对比下现有的主流播放器:媒体播放器列表,VLC是在各个方面都表现很突出的一款。VLC 是一款免费、自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,DVD、音频CD、VCD 以及各类流媒体协议。 VLC是在Linux下用C语言开发的,如果想用其接口,可以将C的接口用C++封装一下,这样使用方便的很多,在CodeProject上搜到一个C++的封装,在他的基础上加了点函数,使用了最新的VLC版本(2.1.0),用MFC做成了如下的样子: 主要实现功能: 1、打开:加载音视频文件(同时开始播放)。 2、播放/暂停:播放暂停文件播放。

3、停止:停止播放。 4、快进:快进5秒。 5、快退:后退5秒。 6、音量:音量调节(0--100)。 7、播放进度控制:使用进度条控制。 基本上实现的功能和CodeProject上那个demo差不多,我修改后可以播放网络流媒体,将加载的文件名修改为流媒体地址就可以了。播放上面双语字幕的文件时貌似不能正常显示中文,VLC播放器本身也有这个问题,不过可以设置修改。其他更多的功能还有待研究,VLC的接口注释都很详细,按照它的接口应该可以实现更多的功能,有问题也可以直接在VideoLan的论坛上发帖问。 主要问题:运行时需要依赖的VLC的plugins目录里的DLL(66M大小)太多,有一些DLL是用不到的,如果封装成ActiveX给Web下调用,打包的cab的会比较大,需要裁剪。。。 VLC的C#封装 如果播放器客户端使用的是.Net开发的,如何使用VLC?可以有以下几种方法: 1、ActiveX控件:可以将上述MFC的播放器封装成ActiveX控件提供给C#调用。鉴于业余时间有限,现在这部分工作还没做。 2、使用.Net的PInvoke技术将VLC的C接口封装成C#接口,这方面网上的文章也很多.

基于Qt+ffmpeg的跨平台安卓实时投屏软件的开发与设计

一种高分辨率实时屏幕共享硬件加速系统 摘要:建立一个支持超高分辨率(如4k)的交互式屏幕共享系统具有挑战性,因为延迟和帧速率在用户体验中扮演着重要角色。屏幕帧需要有效地压缩,而不需要消耗大量的计算资源。提出了一种实时屏幕共享的硬件加速系统,该系统通过利用连续屏幕帧间的内容冗余来减少编码工作量。提出了一种采用不同输入大小的H.264高级视频编码(H.264/AVC)的多个编码器,通过为更新的屏幕内容选择合适的编码方式,节省了编码时间。提出了一种优化的元数据处理方法。帧内的小而远的更新可以分割成独立的帧,以便进行更有效的压缩,这也有利于交互延迟。在评估中,在一般的屏幕共享场景中,该系统比一般的单个编解码器的编码时间更短。对延迟的测量表明,4K分辨率屏幕共享的端到端延迟仅为17-25ms,这使得该系统适合于本地有线和无线连接中的各种应用。 关键词:4K分辨率,硬件-加速编码,低延迟屏幕共享

目录 第1章绪论 (1) 1.1研究背景和意义 (1) 1.1.1 系统的开发背景分析 (1) 1.1.2 本课题的研究意义 (1) 1.2 国内外的研究 (2) 1.2.1 国内研究 (2) 1.2.2 国外研究 (2) 1.3课题研究方法和内容 (2) 1.3.1 研究方法和关键技术 (2) 第2章开发工具及安装 (4) 2.1 Qt (4) 2.1.1 Qt简介 (4) 2.1.2 Qt的安装 (4) 2.2 Visual Studio 2017 (6) 2.2.1 Visual Studio 2017的安装和环境配置 (6) 第3章系统功能需求 (10) 3.1 系统总体功能需求 (10) 3.2 系统总体功能描述 (10) 3.2.1.实时显示Android设备屏幕 (10) 3.2.2实时键鼠控制Android设备 (11) 3.2.3屏幕录制 (11) 3.2.4无线连接 (11) 3.2.5全屏显示 (11) 3.2.6常用功能按键 (11) 3.2.7传输文件/apk (11) 3.2.8后台录制 (11) 3.2.9复制粘贴 (12) 3.2.10在计算机和设备之间双向同步剪贴板 (12) 3.3 用户子系统的功能需求 (12) 第4章系统设计 (13) 4.1 系统总体设计 (13) 第5章 UML建模 (14) 5.1 用例图 (14) 5.1.1 用户用例图 (14) 5.2 用例规约表 (14) 5.2.1 启动服务用例规约表 (14) 5.2.2 相关配置用例规约表 (15) 5.2.3 无线连接用例规约表 (16) 5.3 类图 (18) 5.3.1 系统实现类图 (18) 5.4 顺序图 (19)

ffmpeg主要数据结构和函数

FFMpeg 中比较重要的函数以及数据结构如下:1. 数据结构: (1) AVFormatContext (2) AVOutputFormat (3) AVInputFormat (4) AVCodecContext (5) AVCodec (6) AVFrame (7) AVPacket (8) AVPicture (9) AVStream 2. 初始化函数: (1) av_register_all() (2) avcodec_open() (3) avcodec_close() (4) av_open_input_file() (5) av_find_input_format() (6) av_find_stream_info() (7) av_close_input_file() 3. 音视频编解码函数: (1) avcodec_find_decoder() (2) avcodec_alloc_frame() (3) avpicture_get_size() (4) avpicture_fill() (5) img_convert() (6) avcodec_alloc_context() (7) avcodec_decode_video() (8) av_free_packet() (9) av_free() 4. 文件操作:

(1) avnew_steam() (2) av_read_frame() (3) av_write_frame() (4) dump_format() 5. 其他函数: (1) avpicture_deinterlace() (2) ImgReSampleContext() 以下就根据,以上数据结构及函数在ffmpeg测试代码output_example.c中出现的前后顺进行分析。 交待完毕进入正题。 一.FFMpeg 中的数据结构: I. AVFormatContext 一般在使用ffmpeg sdk的代码中AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容。其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright 等。还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。参考avformat.h头文件。 Useage: 声明: AVFormatContext *oc; (1) 初始化:由于AVFormatConext结构包含许多信息因此初始化过程是分步完成,而且有些变量如果没有值可用,也可不初始化。但是由于一般声明都是用指针因此一个分配内存过程不可少: oc = av_alloc_format_context(); (2) 结构中的AVInputFormat*(或AVOutputFormat*)是一定要初始化的,基本上这是编译码要使用什么codec的依据所在: oc->oformat = fmt; or oc->iformat = fmt; (3) 其中AVOutputFormat* fmt或AVInputFormat* fmt。(AVInputFormat and AVOutputForm at的初始化在后面介绍。随后在参考代码output_example.c中有一行: snprintf(oc-filename, sizeof(oc->filename), “%s”, filename); (4) 还不是十分清楚有什么作用,估计是先要在输出文件中写一些头信息。 在完成以上步骤後,(初始化完毕AVInputFormat*(或AVOutputFormat*)以及AVFormatContext)接下来就是要利用oc初始化本节开始讲到的AVFormatContext中的第二个重要结构。AVStream(假设已

ffmpeg开发指南(经典)

ffmpeg开发指南(使用 libavformat 和 libavcodec) Ffmpeg 中的Libavformat和 libavcodec库是访问大多数视频文件格式的一个很好的方法。不幸的是,在开发您自己的程序时,这套库基本上没有提供什么实际的文档可以用来作为参考(至少我没有找到任何文档),并且它的例程也并没有太多的帮助。 这种情况意味着,当我在最近某个项目中需要用到 libavformat/libavcodec 库时,需要作很多试验来搞清楚怎样使用它们。这里是我所学习的--希望我做的这些能够帮助一些人,以免他们重蹈我的覆辙,作同样的试验,遇到同样的错误。你还可以从这里下载一个demo程序。我将要公开的这部分代码需要0.4.8 版本的ffmpeg库中的 libavformat/libavcodec 的支持(我正在写最新版本)。如果您发现以后的版本与我写的程序不能兼容,请告知我。 在这个文档里,我仅仅涉及到如何从文件中读入视频流;音频流使用几乎同样的方法可以工作的很好,不过,我并没有实际使用过它们,所以,我没于办法提供任何示例代码。 或许您会觉得奇怪,为什么需要两个库文件 libavformat 和 libavcodec :许多视频文件格式(AVI就是一个最好的例子)实际上并没有明确指出应该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑定在一个文件里面。这就是为什么有时候,当你打开了一个AVI文件时,你只能听到声音,却不能看到图象--因为你的系统没有安装合适的视频解码器。所以, libavformat 用来处理解析视频文件并将包含在其中的流分离出来,而libavcodec 则处理原始音频和视频流的解码。 1打开视频文件: 首先第一件事情--让我们来看看怎样打开一个视频文件并从中得到流。我们要做的第一件事情就是初始化libavformat/libavcodec: av_register_all(); 这一步注册库中含有的所有可用的文件格式和编码器,这样当打开一个文件时,它们才能够自动选择相应的文件格式和编码器。要注意你只需调用一次 av_register_all(),所以,尽可能的在你的初始代码中使用它。如果你愿意,你可以仅仅注册个人的文件格式和编码,不过,通常你不得不这么做却没有什么原因。 2下一步,打开文件: AVFormatContext *pFormatCtx; const char *filename="myvideo.mpg"; // 打开视频文件 if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) handle_error(); // 不能打开此文件

ffmpeg绝对编译指南

编译集成ffmpeg指南 ###环境配置(centos/msys2) yum install autoconf automake cmake freetype-devel openssl-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel ###参考地址 https://www.wendangku.net/doc/ab12594694.html,/uid-23069658-id-4018842.html https://www.wendangku.net/doc/ab12594694.html,/wanglx_/article/details/50786307 ###2.1 Yasm(git clone --depth 1 git://https://www.wendangku.net/doc/ab12594694.html,/yasm/yasm.git) 汇编器,编译x264,ffmpeg会用到 autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" make make install make distclean ###libx264 (git clone --depth 1 git://https://www.wendangku.net/doc/ab12594694.html,/x264) H264编码库,开启需要在FFmpeg的configure中指定:--enable-gpl 和--enable-libx264 ./configure --prefix="$HOME/ffmpeg_build" --enable-static --enable-shared make make install make distclean ###初始pkgconfig(必须) export PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ###libx265(hg clone https://https://www.wendangku.net/doc/ab12594694.html,/multicoreware/x265) H265编码库,开启需要在FFmpeg的configure中指定:--enable-gpl 和--enable-libx265 cd 到/x265/build/msys目录下执行对应.sh文件,稍后在cmake弹框中编辑安装目录 make make install ###libfdk_aac(git clone --depth 1 git://https://www.wendangku.net/doc/ab12594694.html,/p/opencore-amr/fdk-aac) AAC编码库,开启需要在FFmpeg的configure中指定:--enable-libfdk-aac autoreconf -fiv ./configure --prefix="$HOME/ffmpeg_build" --enable-shared --enable-static SPEEXDSP_CFLAGS="$HOME/ffmpeg_build/include" SPEEXDSP_LIBS="$HOME/ffmpeg_build/lib" OGG_CFLAGS="$HOME/ffmpeg_build/include" OGG_LIBS="$HOME/ffmpeg_build/lib" make make install make distclean

ffmpeg最全的命令参数

ffmpeg最全的命令参数 Java代码Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Getting help: -h -- print basic options -h long -- print more options -h full -- print all options (including all format and codec specific options, very long) See man ffmpeg for detailed description of the options. Print help / information / capabilities: -L show license -h topic show help -? topic show help -help topic show help --help topic show help -version show version -formats show available formats -codecs show available codecs -decoders show available decoders -encoders show available encoders -bsfs show available bit stream filters -protocols show available protocols -filters show available filters -pix_fmts show available pixel formats -layouts show standard channel layouts -sample_fmts show available audio sample formats Global options (affect whole program instead of just one file: -loglevel loglevel set libav* logging level -v loglevel set libav* logging level

ffmpeg开发指南(经典)

ffmpeg开发指南(使用libavformat和libavcodec) Ffmpeg中的Libavformat和libavcodec库是访问大多数视频文件格式的一个很好的方法。不幸的是,在开发您自己的程序时,这套库基本上没有提供什么实际的文档可以用来作为参考(至少我没有找到任何文档),并且它的例程也并没有太多的帮助。 这种情况意味着,当我在最近某个项目中需要用到libavformat/libavcodec 库时,需要作很多试验来搞清楚怎样使用它们。这里是我所学习的--希望我做的这些能够帮助一些人,以免他们重蹈我的覆辙,作同样的试验,遇到同样的错误。 你还可以从这里下载一个demo程序。我将要公开的这部分代码需要0.4.8版本的ffmpeg库中的libavformat/libavcodec的支持(我正在写最新版本)。如果您发现以后的版本与我写的程序不能兼容,请告知我。 在这个文档里,我仅仅涉及到如何从文件中读入视频流;音频流使用几乎同样的方法可以工作的很好,不过,我并没有实际使用过它们,所以,我没于办法提供任何示例代码。 或许您会觉得奇怪,为什么需要两个库文件libavformat和libavcodec:许多视频文件格式(AVI就是一个最好的例子)实际上并没有明确指出应该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑定在一个文件里面。这就是为什么有时候,当你打开了一个AVI文件时,你只能听到声音,却不能看到图象--因为你的系统没有安装合适的视频解码器。所以,libavformat用来处理解析视频文件并将包含在其中的流分离出来,而libavcodec则处理原始音频和视频流的解码。 1打开视频文件: 首先第一件事情--让我们来看看怎样打开一个视频文件并从中得到流。我们要做的第一件事情就是初始化libavformat/libavcodec: av_register_all();

基于Gstreamer框架的ffmpeg流媒体编解码设计

Software Development ? 软件开发 Electronic Technology & Software Engineering 电子技术与软件工程? 43 【关键词】ffmpeg gstreamer 编解码 流媒体 把采集的yuv 格式通过ffmpeg 编解码库编码成h264格式,再通过网络传输到室内播放终端,在室内机终端设备再通过ffmpeg 解码器转换为yuv420p 格式,最终转换为RGB 格式,并在Linux 系统的ARM 平台上利用QT 图形化界面显示。最终实现了数字可视对讲系统功能实现的整个流程。 基于Gstreamer 框架的ffmpeg 流媒体编解码设计 文/王锋1 陆凯2 Gstreamer 是一个基于管道Pipeline 的多 媒体应用框架,采用C 语言编程,但是通过gObject ,将各插件封装成面向对象编程的工具。元件 Element 是Gstreamer 最重要和基本的对象类,通过插件Plugin 的形式提供,多个元件Elements 可以组合为箱柜bin ,并进一步聚合形成一个管道Pipeline 完成一个多媒体应用处理。目前是嵌入式Linux 最为常用的处理多媒体应用框架。我们主要是在ffmpeg 多媒体编解码的过程中加入Gstreamer 的应用框架。 1 基于gstreamer的流媒体可视对讲系统开发过程 Gstreamer 框架中使用gst-launch 命令进行流媒体播放,我们在开发过程中,主要使用gst-launch 在终端编译和运行一条pipeline 用于播放多媒体。gst-launch-0.10 或gst-launch-1.0一般ubuntu 系统自带,相关插件包可通过wget 下载opky 安装。由于是基于嵌入式ARM 芯片的流媒体开发,还需交叉编译相关 gstreamer 动态库移植到下位机平台,如glib 库、gstreamer 插件库libgstqt5videosink.so 、qt5lib 库libQt5GLib-2.0.so 、libQt5GStreamer-1.0.so 等。 开发过程中调用的gst 代码有gst-ffmpeg-0.11.2、gst-libav-1.14.4等。 1.1 用GStreamer作v4l2摄像头采集和输出到YUV文件 由于需要做摄像头的视频采集,所以首先在内核中添加视频采集模块Video4Linux2,它是一种内核设备驱动,主要为Linux 下的应用程序编程提供视频设备接口函数,同时,由于我们是基于GStreamer 框架开发,故在v4l2摄像头采集中加入GStreamer 插件的方式进行开发。其中 Video4Linux2插件是一个用于捕捉和播放视频的API 和驱动框架,支持一般的摄像头设备。 v4l2本身不仅仅是支持视频采集功能,它还支持其他的视频功能,元件v4l2src 属于Video4Linux2插件,用于读取Video4Linux2用户有更自由灵活的选择,丰富产品多样性满足需求;其次快捷支付扫码应用平台管理系统在传统微信支付、支付宝支付等第三方移动支付平台的安全保障的基础上,还提供了自己的一套安全保障措施,让用户享受更好用户体验的同时,给用户提供更好的资金安全保障;最后,快捷支付扫码应用平台管理系统还提供了支付分析、收入分析等统计和预测的功能,让用户可以简介明了地查阅相关收支记录与历史统计,方便用户对移动支付的整体控制与预期控制。 4 系统测试 经过内部测试和系统预发布测试,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,能够与运用广泛的微信支付、支付宝支付无缝结合,实用性强,系统内拥有独立的安全检测机制,大大提高了系统的安全性,在保证用户体验的同时保障用户资金安全。 5 总结 <<上接42页 移动互联网的时代悄悄到来,智能手机及各式各样手持装置的日渐普及,消费者购物时使用的支付工具也面临着巨大改变,互联网到移动互联网,网络支付到移动支付,移动支付在短短数年间已经成为最火热的应用增长点。快捷支付扫码应用平台管理系统通过系统内后台模版配置和动态调整等为用户提供整合、高可用及动态弹性分配,能够快速部署和使用系统内数据存储信息,同时提升了传统资源下数据共享之间的关系,用来对快捷支付进行扫码应用,具体有支付分析、支付统计、支付保护等功能组成。经过内部测试和系统预发布测试表明,快捷支付扫码应用平台管理系统具有良好的系统适应性与兼容性,友好的操作界面,系统功能完善,操作直观方便,易学易用,安全可靠等优点,是一款值得推广实用的新型移动支付系统。 参考文献 [1]魏国强.移动运营商主导的移动电子商 务的支付模式研究[D].重庆:重庆大学,2012. [2]马近朱.新城镇化与第三方支付机构 的移动支付业务[J].北京:中国信用卡,2013(09):52. [3]王娜.对国内移动支付产业发展的思考 [J].北京:时代经贸:下旬,2016(01).89.[4]张海霞.我国移动支付商业模式探索[J]. 山西:山西科技,2014(01):13. [5]肖心怡.基于用户目标的以信息为中心的 手机交互设计[D].湖南:湖南大学,2014.[6]卢益清.中国移动支付现状与前景探析 [J].北京:卷宗,2015(09).143.[7]陈化南.NFC 成为移动支付主流技术[J]. 上海:电信快报网络与通信,2015(09):43. 作者简介 石宸彬,曲阜师范大学信息科学与工程学院网络工程2018级二班。 作者单位 曲阜师范大学信息科学与工程学院网络工程2018级 山东省曲阜市 276826

FFMPEG的移植与使用

FFMPEG的移植与使用 前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了。今日得闲整理温习了一下ffmpeg在嵌入式上的运用,这里给大家分享一下,顺便做了一下记录以备以后使用时参考。 本文(记录)与目前网上很多关于ffmpeg的文章相比有两个特点: 一、重点不在于ffmpeg的解码部分(这个本来是ffmpeg最大的亮点),为什么?前面说了,这是我以前工作的一个整理。况且关于ffmpeg的解码相关文章非常多了,如果大家感兴趣的话,可以后面第五部分增加吧。 二、本文是不采用其他第三方的开源多媒体框架而在嵌入式硬件上做多媒体播放项目。第三方的多媒体框架软件隐藏了一些扩展数据的关键处理,很多初学者可能不清楚这些细节问题,所以当ffmepg在自己的解码移植上没有问题,真正在用嵌入式硬件进行解码时会遇到这种问题。 下载最新版本的ffmpeg-3.1.1,解压 配置: 配置后会输出以下信息,有几点较为有用,列举如下: 分别是: 库安装的位置 不知道

所用c编译器 所用C库 主机的c编译器 主机的c库 库安装后所支持的平台 是否支持大端 是否支持shared 是否支持static 是否支持network 是否支持threading 是否支持SDL 生成的工具(注意没有生成ffplay,尚未找到解决方案) 支持的解码格式,图片仅截取一小部分) 支持的编码格式(图片仅截取一小部分) 支持的协议,如tcp,udp,ftp,http等 支持的输入设备 支持的输出设备 遵循的协议

然后进行make编译,再make install 在Linux目录下,编译成功,生成我们的动态库: 这样我们生产了我们需要的动态库和头文件。 将bin目录下的工具拷贝到开发板/bin目录下,修改权限,运行./ffmpeg,根据报错逐一复制lib目录下的库到开发板的/lib目录下,注意大部分库是链接,要复制原文件,然后创建链接 这个过程很繁琐,坚持下去 下面介绍ffmpeg的应用 1.录制视频 保存成.asf文件,可以直接在pc机播放(针对V4L2,当然ffmpeg也支持其他设备,如vfwcap,) 命令: ffmpeg -f video4linux2 -s 320*240 -r 10 -i /dev/video4 test.asf -f fmt force format -s size 指明大小,size=宽*高 set frame size (WxH or abbreviation) -r rate set frame rate (Hz value, fraction or abbreviation) -i 视频输入设备 最后接输出文件 由于摄像头分辨率较低,所以大小还是不要设置太大,不然视频很不清晰此,像素点都变成方块显示出来了,亲测 输出参数:包含大小,时间长度,帧数 其他有用选项 -fs limit_size set the limit file size in bytes,设置输出文件的大小 -ss time_off set the start time offset 设置启动录制视频事件 -sseof time_off set the start time offset relative to EOF 设置视频拍摄长度

FFMpeg SDK 开发手册

FFMpeg SDK 开发手册FFMpeg 中比较重要的函数以及数据结构如下: 1.数据结构: (1)A VFormatContext (2)A VOutputFormat (3)A VInputFormat (4)A VCodecContext (5)A VCodec (6)A VFrame (7)A VPacket (8)A VPicture (9)A VStream 2.初始化函数: (1)av_register_all() (2)avcodec_open() (3)avcodec_close() (4)av_open_input_file() (5)av_find_input_format() (6)av_find_stream_info() (7)av_close_input_file() 3.音视频编解码函数: (1)avcodec_find_decoder() (2)avcodec_alloc_frame() (3)avpicture_get_size() (4)avpicture_fill() (5)img_convert() (6)avcodec_alloc_context() (7)avcodec_decode_video() (8)av_free_packet() (9)av_free() 4.文件操作: (1)avnew_steam() (2)av_read_frame() (3)av_write_frame() (4)dump_format() 5.其他函数: (1)avpicture_deinterlace() (2)ImgReSampleContext()

使用Red5,FFMpeg搭建在线Flash流媒体分享平台

使用Red5和FFMpeg搭建在线Flash流媒体分享平台 最近视频的东西比较火,前些天我也稍微了解了一下使用开源软件建在线Flash 流媒体播放平台的解决方案,还是有一些收获。 Red5是一款基于java的开源的Flash流媒体Server 软件,可以作为取代Macromedia提供的商业版本FMS。Red5使用RSTP作为流媒体传输协议,内置了一些示例,这些示例实现了在线录制, flash流媒体播放,在线聊天,视频会议等一些基本的功能。由于系统本身是开源的,在碰到问题的时候也比较容易解决,大不了直接改代码,在成本方面也可以省下一笔不小的开销,为未来的功能扩展也提供了充分的空间。 如果仅仅是实现在线录制,在线播放,那么Red5也就差不多够了,但可能我们有时候还需要用户上传自己拍摄的视频文件,而要把这些视频文件转成可播放的flv文件就需要视频编码软件了。FFMpeg提供了录制,播放,视频流处理的完整解决方案。它自身也带了一个基于HTTP的流媒体广播程序以及其它几个实用的程序,但我们的重点还是它的视频转换程序,似乎Google Video也是用的它的程序作为视频转换工具。 我用FFMpeg转了几个视频,效果还可以,在声音上碰到了一些问题,在不添加参数的情况下,有一部分视频的声音会有问题,有的视频无论怎么添加参数,都出不来声音,报错提示的是不支持所带的声音采样格式,只支持几种固定的格式,我看了一下代码,确实是这样子,但理论上应该是能够解决的。 FFMpeg自带的libavcodec是一套很牛的编码库,为了保证质量和性能,里面的很多codec 都是从头开发的。 这两个加起来,实现一些简单的在线视频功能就差不多了。

视频编解码FFMPEG

视频编解码FFMPEG ffmpeg开发指南 Posted on 2008-12-08 16:11 李健阅读(672) 评论(0) 编辑收藏引用所属分类: 视频解码笔记 ffmpeg开发指南(使用 libavformat 和 libavcodec) Ffmpeg 中的Libavformat 和 libavcodec库是访问大多数视频文件格式的一个很好的方法。不幸的是,在开发您自己的程序时,这套库基本上没有提供什么实际的文档可以用来作为参考(至少我没有找到任何文档),并且它的例程也并没有太多的帮助。 这种情况意味着,当我在最近某个项目中需要用到 libavformat/libavcodec 库时,需要作很多试验来搞清楚怎样使用它们。这里是我所学习的,,希望我做的这些能够帮助一些人,以免他们重蹈我的覆辙,作同样的试验,遇到同样的错误。你还可以从这里下载一个demo程序。我将要公开的这部分代码需要0.4.8 版本的ffmpeg库中的 libavformat/libavcodec 的支持(我正在写最新版本)。如果您发现以后的版本与我写的程序不能兼容,请告知我。 在这个文档里,我仅仅涉及到如何从文件中读入视频流;音频流使用几乎同样的方法可以工作的很好,不过,我并没有实际使用过它们,所以,我没于办法提供任何示例代码。 或许您会觉得奇怪,为什么需要两个库文件 libavformat 和 libavcodec :许多视频文件格式(AVI就是一个最好的例子)实际上并没有明确指出应该使用哪种编码来解析音频和视频数据;它们只是定义了音频流和视频流(或者,有可能是多个音频视频流)如何被绑定在一个文件里面。这就是为什么有时候,当你打开了一个

ffmpeg简介及命令选项参数

ffmpeg简介及命令选项参数 一、ffmpeg简介 (1) 二、ffmpeg基本用法 (1) 三、ffmpeg选项 (1) 四、ffmpeg使用 (4) 一、ffmpeg简介 ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。两个库文件libavcodec和libavformat。 ffmpeg项目由以下几部分组成: ●ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。 ●ffserver 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器,也支持时间平移●ffplay 用SDL和FFmpeg库开发的一个简单的媒体播放器 ●libavcodec 一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复 用性,大多数编解码器从头开发的. ●libavformat 一个包含了所有的普通音视格式的解析器和产生器的库. 二、ffmpeg基本用法 ffmpeg作为媒体文件处理软件,基本用法如下: ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile 输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。大部分常见的格式都能够“通杀”。象常见的各种mpeg,A VI封装的DIVX 和Xvid等等,具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。 另:由于Linux把设备视为文件,因此-i选项后可以跟设备名。比如DV,视频卡,光驱或者其它的各类设备。 如果没有输入文件,那么视音频捕捉就会起作用。 作为通用的规则,选项一般用于下一个特定的文件。如果你给–b 64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。 缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。 三、ffmpeg选项 输出的内容通过Options调整。列出几个主要的选项 a) 通用选项 -L license -h 帮助 -fromats 显示可用的格式,编解码的,协议的。。。 -f fmt 强迫采用格式fmt

相关文档
相关文档 最新文档