【转】ffmpeg tutorial 2:输出到屏幕

【ffmpeg-libav-tutorial】介绍——视频、音频、编码器、容器、使用方法 介绍——视频、音频、编码器、容器介绍视频——你所看到的音频编码器——数据压缩容器FFmpeg-命令行FFmpeg命令行工具 介绍 视频——你所看到的 如果你有一序列的图片,并且以一个给定的频率来改变他们出现的时间(比如24张图片每秒),那么你就能看到一个运动的感觉。换句话来说,视频的基本思想就是:以一定的速率改变一系列图片的出现。 音频 虽然静音视频已经能够表达各种各样的感受,但是往视频里添加声... 阅读详情
 
指导2:输出到屏幕

SDL 和视频

 

为了在屏幕上显示,我们将使用SDL.SDL是Simple Direct Layer的缩写。它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中。你可以从它的官方网站的网址 http://www.libsdl.org/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中。按照这个指导,你将需要 编译这个库。(剩下的几个指导中也是一样)

SDL库中有许多种方式来在屏幕上绘制图形,而且它有一个特殊的方式来在屏幕上显示图像――这种方式叫做YUV覆盖。YUV(从技术上来讲并不叫 YUV而 是叫做YCbCr)是一种类似于RGB方式的存储原始图像的格式。粗略的讲,Y是亮度分量,U和V是色度分量。(这种格式比RGB复杂的多,因为很多的颜 色信息被丢弃了,而且你可以每2个Y有1个U和1个V)。SDL的YUV覆盖使用一组原始的YUV数据并且在屏幕上显示出他们。它可以允许4种不同的 YUV格式,但是其中的YV12是最快的一种。还有一个叫做YUV420P的YUV格式,它和YV12是一样的,除了U和V分量的位置被调换了以外。 420意味着它以4:2:0的比例进行了二次抽样,基本上就意味着1个颜色分量对应着4个亮度分量。所以它的色度信息只有原来的1/4。这是一种节省带宽 的好方式,因为人眼感觉不到这种变化。在名称中的P表示这种格式是平面的――简单的说就是Y,U和V分量分别在不同的数组中。FFMPEG可以把图像格式 转换为YUV420P,但是现在很多视频流的格式已经是YUV420P的了或者可以被很容易的转换成YUV420P格式。

于是,我们现在计划把指导1中的SaveFrame()函数替换掉,让它直接输出我们的帧到屏幕上去。但一开始我们必需要先看一下如何使用SDL 库。首先我们必需先包含SDL库的头文件并且初始化它。

#include <SDL.h>

#include <SDL_thread.h>

 

if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {

fprintf(stderr, "Could not initialize SDL - %s/n", SDL_GetError());

exit(1);

}

SDL_Init()函数告诉了SDL库,哪些特性我们将要用到。当然SDL_GetError()是一个用来手工除错的函数。

 

创建一个显示

 

现在我们需要在屏幕上的一个地方放上一些东西。在SDL中显示图像的基本区域叫做面surface 。

SDL_Surface *screen;

 

screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);

if(!screen) {

fprintf(stderr, "SDL: could not set video mode - exiting/n");

exit(1);

}

这就创建了一个给定高度和宽度的屏幕。下一个选项是屏幕的颜色深度――0表示使用和当前一样的深度。(这个在OS X系统上不能正常工作,原因请看源代码)

现在我们在屏幕上来创建一个YUV覆盖以便于我们输入视频上去:

SDL_Overlay *bmp;

 

bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,

SDL_YV12_OVERLAY, screen);

正如前面我们所说的,我们使用YV12来显示图像。

 

显示图像

 

前面那些都是很简单的。现在我们需要来显示图像。让我们看一下是如何来处理完成后的帧的。我们将原来对RGB处理的方式,并且替换 SaveFrame() 为显示到屏幕上的代码。为了显示到屏幕上,我们将先建立一个AVPicture结构体并且设置其数据指针和行尺寸来为我们的YUV覆盖服务:

if(frameFinished) {

SDL_LockYUVOverlay(bmp);

 

AVPicture pict;

pict.data[0] = bmp->pixels[0];

pict.data[1] = bmp->pixels[2];

pict.data[2] = bmp->pixels[1];

 

pict.linesize[0] = bmp->pitches[0];

pict.linesize[1] = bmp->pitches[2];

pict.linesize[2] = bmp->pitches[1];

 

// Convert the image into YUV format that SDL uses

img_convert(&pict, PIX_FMT_YUV420P,

(AVPicture *)pFrame, pCodecCtx->pix_fmt,

pCodecCtx->width, pCodecCtx->height);

 

SDL_UnlockYUVOverlay(bmp);

}

首先,我们锁定这个覆盖,因为我们将要去改写它。这是一个避免以后发生问题的好习惯。正如前面所示的,这个AVPicture结构体有一个数据指针 指向一 个有4个元素的指针数据。由于我们处理的是YUV420P,所以我们只需要3个通道即只要三组数据。其它的格式可能需要第四个指针来表示alpha通道或 者其它参数。行尺寸正如它的名字表示的意义一样。在YUV覆盖中相同功能的结构体是像素pixel和程度pitch。(程度pitch是在SDL里用来表 示指定行数据宽度的值)。所以我们现在做的是让我们的覆盖中的pict.data中的三个指针有一个指向必要的空间的地址。类似的,我们可以直接从覆盖中 得到行尺寸信息。像前面一样我们使用img_convert来把格式转换成PIX_FMT_YUV420P。

 

绘制图像

 

但我们仍然需要告诉SDL如何来实际显示我们给的数据。我们也会传递一个表明电影位置、宽度、高度和缩放大小的矩形参数给SDL的函数。这 样,SDL为我们做缩放并且它可以通过显卡的帮忙来进行快速缩放。

SDL_Rect rect;

 

if(frameFinished) {

 

// Convert the image into YUV format that SDL uses

img_convert(&pict, PIX_FMT_YUV420P,

(AVPicture *)pFrame, pCodecCtx->pix_fmt,

pCodecCtx->width, pCodecCtx->height);

 

SDL_UnlockYUVOverlay(bmp);

rect.x = 0;

rect.y = 0;

rect.w = pCodecCtx->width;

rect.h = pCodecCtx->height;

SDL_DisplayYUVOverlay(bmp, &rect);

}

现在我们的视频显示出来了!

 

让我们再花一点时间来看一下SDL的特性:它的事件驱动系统。SDL被设置成当你在SDL中点击或者移动鼠标或者向它发送一个信号它都将产生一个事 件的驱 动方式。如果你的程序想要处理用户输入的话,它就会检测这些事件。你的程序也可以产生事件并且传递给SDL事件系统。当使用SDL进行多线程编程的时候, 这相当有用,这方面代码我们可以在指导4中看到。在这个程序中,我们将在处理完包以后就立即轮询事件。现在而言,我们将处理SDL_QUIT事件以便于我 们退出:

SDL_Event event;

 

av_free_packet(&packet);

SDL_PollEvent(&event);

switch(event.type) {

case SDL_QUIT:

SDL_Quit();

exit(0);

break;

default:

break;

}

让我们去掉旧的冗余代码,开始编译。如果你使用的是Linux或者其变体,使用SDL库进行编译的最好方式为:

gcc -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lz -lm /

`sdl-config --cflags --libs`

这里的sdl-config命令会打印出用于gcc编译的包含正确SDL库的适当参数。为了进行编译,在你自己的平台你可能需要做的有点不同:请查 阅一下SDL文档中关于你的系统的那部分。一旦可以编译,就马上运行它。

 

当运行这个程序的时候会发生什么呢?电影简直跑疯了!实际上,我们只是以我们能从文件中解码帧的最快速度显示了所有的电影的帧。现在我们没有任何代 码来计 算出我们什么时候需要显示电影的帧。最后(在指导5),我们将花足够的时间来探讨同步问题。但一开始我们会先忽略这个,因为我们有更加重要的事情要处理: 音频!

【ffmpeg-libav-tutorial】ffmpeg的hello world FFmpeg的hello world ffmpeg的hello world并不是打印hello world,而是打印视频的信息。比如他的容器格式、长度、分辨率、音频通道,最后我们将会解码一些帧并将他们保存为图片 ffmpeg的架构 首先先了解一下ffmpeg的架构以及他的组件如何与其他组件进行通信,如图是视频解码的过程: 首先,我们需要将视频文件加载到AVFormatContext结构体,实际上... 阅读详情

相关推荐

ffmpeg+intel核显实现硬解码

之前写了一篇关于ffmpeg+nvcuvid实现硬解码的文章,最近得到一个只有intel集显的笔记本电脑,cpu是比较垃圾的5200U,核显是HD5500,也是个有年头的老爷机了吧。因为intel解码没有nvidia那么热门,以目前只研究出来解码,暂时没研究出来编码。还是由于nvidia在AI领域的地位,导致目前生态很好,使用起来也几乎没有什么障碍,可以说是最简单的了。相比来讲amd和intel在这些领域就冷门了,好多东西搞起来不是那么容易。

jiexijihe945的博客 5824

FFPlay 播放采集卡

一、查看设备列表 ffmpeg -list_devices true -f dshow -i dummy 显示有中文乱码,那么设置一下DOS窗口 chcp 65001 ,就可以不乱码了。 二、播放采集卡的视频 ffplay -f dshow -i video="USB3.0 Capture Video"   三、播放采集卡的音频 ffplay -f dshow -i audio="数字...

w13511069150的博客 3694

ffmpeg文档2:输出到屏幕

指导2:输出到屏幕 SDL和视频 为了在屏幕上显示,我们将使用SDL.SDL是Simple DirectLayer的缩写。它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中。你可以从它的官方网站的网址http://www.libsdl.org/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中。按照这个指导,你将需要编译这个库。(剩

Henry_He 的专栏 1408

Ubuntu 24.04 下 NoMachine 极速安装与远程桌面配置全攻略

本文详细介绍了在Ubuntu 24.04系统下安装和配置NoMachine远程桌面的完整指南。从系统准备、分步安装到性能调优和常见问题解决,帮助用户快速实现低延迟的远程桌面访问。特别适合开发者和IT管理员在Linux环境下高效部署远程工作环境。

moon9的博客 945

CloudCompare里那个CSF地面滤波插件,到底怎么用?手把手教你分离点云里的地面

本文详细介绍了如何在CloudCompare中使用CSF地面滤波插件分离点云中的地面数据。通过解析布料模拟滤波算法的核心参数,如布料刚度和网格分辨率,并提供不同地形(城市、丘陵、山地)的适配策略,帮助用户高效处理复杂点云数据。文章还包含实战案例和优化技巧,确保滤波结果的精度和可靠性。

weixin_42548708的博客 220

关于海思3536编解码与FFmpeg的相关问题——推流相关

在使用海思3536对摄像头拉取到流后,利用ffmpeg解协议头,然后进行硬解码,SDL渲染位图,叠加OSD,HDMI显示,硬编码,ffmpeg推流,此部分是推流的相关问题。

Cykangkk的博客 2665

天气预测模型:基于时间序列分析的数学建模与实战案例

目录引言时间序列分析介绍使用Matlab进行天气预测实战案例:天气预测结论天气预测一直是气象学和相关领域的重要研究问题之一。数学建模是进行天气预测的有效方法之一,其中时间序列分析是常用的技术。在本篇博客中,我们将介绍时间序列分析的基本原理,演示如何使用Matlab进行模型建立和预测,并通过一个实战案例来展示模型的应用和分析。时间序列分析是一种用于分析和预测时间序列数据的统计方法。天气数据通常具有时间依赖性和随机性,因此时间序列分析可以帮助我们了解天气的变化趋势和规律,并提供对未来天气的预测。时间序列分析通常

YOLO 1545

ffmpeg 多路操作

ffmpeg -i input -vf crop=iw/3:ih:iw/3:0 output 中间三分之一。ffmpeg -i input -vf crop=iw/3:ih:iw/3*2:0 output 右边三分之一。音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。libavutil:包含一些公共的工具函数的使用库,包括算数运算 字符操作;ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;

hvac_011的博客 1739

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

Vue Print Designer——一款让打印模板的设计变简单的可视化打印设计器

bjzhang75的博客 682

【全网最新OD题库】2026华为 OD 机试C卷 机考真题库清单(全真题库)含考点说明(华为OD+2025年C卷+2025年B卷+2025年A卷+E卷+D卷+C卷)

华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2024年最新题库,一文带你读懂华为OD,华为机试e卷,华为OD2025B卷、华

KJ.JK 3万+

【ffmpeg学习记录】解决ffmpeg-tutorial的噪声问题

在ffmpeg 2.5.1版本下编译ffmpeg-tutorial,发现所有与音频相关的tutorial都有噪声,而ffplay却能完美播放。问度娘谷歌无果,只好看ffplay的代码。 在ffplay.c中,有三个与audio有关的重要函数,分别是read_thread、decoder_decode_frame、audio_decode_frame。read_thread负责从文件或流中读取数据

sgwhp的专栏 4408

2026华为OD面试手撕代码真题目录

一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。

MISAYAONE的博客 9万+

ffmpeg学习(2)--An ffmpeg and SDL Tutorial

ffmpeg学习(2)--An ffmpeg and SDL Tutorial 安装好ffmpeg后,就开始学习如何应用了,主要也就是熟悉一些常用API。 同事推荐了一个ffmpeg的自学教程--An ffmpeg and SDL Tutorial,觉得不错,就开始照敲代码了。这个教程的网址为:http://dranger.com/ffmpeg/tutorial01.html 学习过程中

gavin的专栏 5013

当几何失效时:3D激光SLAM退化场景的本质与应对策略

本文探讨了3D激光SLAM在退化场景(如长廊、隧道等)中的挑战与解决方案。文章从数学角度分析了退化原因,指出信息矩阵秩亏导致某些方向约束缺失。主流算法采用不同策略应对:LeGO-LOAM利用地面约束与解耦优化;LIO-SAM/LVI-SAM通过多传感器融合补偿;FAST-LIO系列依赖IMU短期积分。新兴的RID-LIO方案创新性地利用激光强度信息增强约束,实验显示精度提升63.59%。研究表明,针对不同退化方向需要采用特异性补偿策略,而挖掘现有传感器的潜在信息维度是提升鲁棒性的有效途径。

Studying…… 617

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

FFmpeg In Android - tutorial-2-Outputting to the Screen输出到屏幕

SDL and Video SDL 和视频 To draw to the screen, we’re going to use SDL. SDL stands for Simple Direct Layer, and is an excellent library for multimedia, is cross-platform, and is used in several projects....

kingdam578的专栏 315

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VS2008+ffmpeg SDK3.2调试tutorial01

VS2008+ffmpeg SDK3.2调试tutorial01 分类: FFmpeg 2012-02-22 11:07 2749人阅读 评论(9) 收藏 举报 codecstreamvideobufferfilenull 最近研究ffmpeg,在ubuntu下感觉不太好调试,老是找不到函数的声明。所以我就把他移到windows下用vs2008分析 关于环境的

心之所向,身之所往 1083

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

FFmpeg_Tutorial

FFmpeg工具和sdk库的使用demo--https://github.com/yinwenjie/FFmpeg_Tutorial 一、使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1、基本介绍 对于每一个从事音视频技术开发的工程师,想必没有一个人对FFmpeg这个名称感到陌生。FFmpeg是一套非常知名的音视频处理的开源工具,它包含了开发完成的工具软件、封装好的函数库以...

507

FFmpeg-Tutorial-CN: 掌握多媒体处理的利器

FFmpeg-Tutorial-CN: 掌握多媒体处理的利器 则是一个精心编译的中文教程集合,旨在帮助中国开发者更好地理解和使用 FFmpeg。 项目简介 FFmpeg-Tutorial-CN 是 Huwan 在 GitCode 上发布的一个开源项目,它提供了 FFmpeg 的详细教程和实战案例,覆盖了从基础概念到高级应用的各种场景。这个项目不仅有丰富的文字说明,还包含了许多实例代码,对于初学者和...

gitblog_00096的博客 599

ffmpeg学习之tutorial_1

最近对ffmpeg感兴趣, 由于我用的是ffmpeg1.1.3,由于 ffmpeg更新很快,网上的很多例子已经很陈旧了,找到了最新版本的这个tutorial点击打开链接。由于对ffmpeg不熟悉,所以需要不断地查看接口。在参考了http://my.oschina.net/u/555701/blog/56616?p=3#comments的基础上,于是有了如下的解析。与新手共勉。 Tutoria

wdxz6547的专栏 1192

ffmpeg tutorial 2:输出到屏幕

指导2:输出到屏幕 SDL和视频 为了在屏幕上显示,我们将使用SDL.SDL是Simple Direct Layer的缩写。它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中。你可以从它的官方网站的网址 http://www.libsdl.org/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中。按照这个指导,你将需要 编译这个库。(剩下的几

w_ww_w的专栏 564

FFmpeg Tutorial

本文转载自Github上面殷汶杰-yinwenjie的一个项目FFmpeg_Tutorial FFmpeg TutorialFFmpeg_Tutorial一、使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑1、基本介绍2、FFmpeg组成3、FFMpeg工具的下载和使用(1)FFmpeg工具的下载:(2)ffplay.exe的使用(3)ffprobe的使用(4)ffmpeg的使用二、调用FFmpeg SDK对YUV视频序列进行编码1、FFMpeg进行视频编码所需要的结构:2、FFMpeg编码的

ccf19881030的专栏 646

FFmpeg tutorial0-4 总结

实验一总结:       -------处理视频文件的过程 1.要打开一个音视频文件,第一步,我们要初始化媒体库,对于ffmpeg我们将avcodec.h和avformat.h包含进来就行了,这两个文件包含了库所支持的所有文件格式和编解码器,通过调用av_register_all() 将这些信息进行注册,这样就可以将相应的文件格式对应到合适的解码器。 1.第二步,打开文件,使用av_open

3437

ffmpeg tutorial

第一部分:制作屏幕录像

xutom2006的专栏 1190

【转】ffmpeg tutorial翻译——第一部分:制作屏幕录像

 英文原文地址:http://www.dranger.com/ffmpeg/转载翻译博客地址:http://blog.sina.com.cn/s/blog_46dc65a90100a91b.html文中涉及的源码打包地址:http://www.dranger.com/ffmpeg/ffmpegsource.tar.gz指导1:制作屏幕录像源代码:tutorial01

code09的专栏 1236
上一篇: 【转】ffmpeg tutorial翻译——第一部分:制作屏幕录像
下一篇: 【转】ffmpeg tutorial 3:播放声音
code09
博客等级 码龄18年 31粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值