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

FFMpeg学习(五)录制小视频时几个问题解决

1.YUV数据在使用avfilterscale时在特定的分辨率下UV分量不对由于是小视频,那么分辨率不需要太高,但是有的视频源是1080p,甚至有的是4K的,所以对视频源进行scale

1. YUV数据在使用avfilter scale时在特定的分辨率下UV分量不对

    由于是小视频,那么分辨率不需要太高,但是有的视频源是1080p,甚至有的是4K的,所以对视频源进行scale非常有必要。scale操作可以使用avfilter或者sws_scale完成,具体参考:

  • FFMpeg学习(四)FFMpeg对视频或图片添加水印;
  • FFMpeg学习(一) 使用FFmpeg将任意格式图片转换成任意格式图片

    在对视频数据进行decode后,得到了包含YUV数据的AVFrame,AVFrame中的data[0], data[1], data[2]分别表示YUV三个分量,YUV三个分量的数据量之比是4:1:1,每行的字节数分别是linesize[0], linesize[1], linesize[2]。

    假定图像长宽分别为w和h,那么Y分量字节数为w*h,linesize[0]等于w,U/V分量字节数均为0.5w*0.5h,linesize[1]等于linesize[2]等于0.5w。但是实际使用时发现,特定分辨率下scale后的UV分量显示不正常,进一步发现UV的linesize有时不等于0.5w,对此FFMpeg(avframe.h)是这么解释的:

     * @note The linesize may be larger than the size of usable data -- there * may be extra padding present for performance reasons. */
    int linesize[AV_NUM_DATA_POINTERS];

    实际上确实发现UV分量的linesize不等于0.5w,这样的话,在拷贝UV分量的时候,就需要一行一行拷贝,每行拷贝0.5w,这个问题也就解决了。

Tips:Mac下使用GLYUVPlay.app软件,导入原始的YUV数据,输入分辨率,YUV格式等信息,可以查看原始YUV数据的分量信息,对于解决问题非常有帮助。

2. PCM在使用FFMpeg的aac编码器编码时提示编码失败

    在特定的手机上,aac会编码失败,提示的是"Input contains (near) NaN/+-Inf\n"。但是很奇怪,只在特定的手机出现该问题,查了半天没有结果,看到有人说libfdk-aac库可能会解决这个问题,将fdk-aac添加进FFMpeg后,编码没有问题,但是编码出来后的数据有爆音,使用Audacity软件查看dump下的数据,确实有爆音,也就是说程序还是有问题。仔细审代码最后发现,aac编码输入的PCM数据只有一个声道的,而编码参数里写的输入为两个声道,而第二个声道的数据没有赋值,将第二个声道拷贝了输入数据后,问题就解决了。。

    总结一下,不是所有的手机都没问题,那就证明程序还是有问题。

Tips:Mac下使用Audacity软件,输入原始PCM数据的采样率、音频数据格式后,可以查看原始PCM数据波形,有无爆音等问题。

 3. 视频尺寸裁切不生效

    视频尺寸裁切时,用libavfilter的crop参数,我之前的理解,av_buffersink_get_frame出来的frame数据就变成了裁切后的尺寸,后来发现不是这样。av_buffersink_get_frame后的frame只是width, height变成了裁切尺寸的长宽,data[]指针和linesize大小都没有变。debug发现,frame的crop相关参数变了,在重新编码时,就会根据crop参数和width, height参数编码成裁切后的尺寸。

 4. 录制GIF时花屏

    按照录制视频的代码去录制GIF时发现录制后的GIF花屏,查阅资料可以,GIF的out format必须是AV_PIX_FMT_RGB8,把pixel_format改成RGB8后就OK了。

5. 对带有HE-AAC的视频编码失败

    之前一直以为服务器的视频都是LC-AAC格式的,这种格式的采样样本数nb_samples是1024个,而HE-AAC视频的nb_samples是2048个,并且FFmpeg自带的aac编码器只支持LC-AAC编码。于是不得已,只能换为fdk-aac编码器,根据文档,fdk-aac编码器两种格式的aac都支持。但是fdk-aac编码器只支持S16格式的PCM,因此对解码后得到的PCM又加了一层resample,将原来FLTP格式的PCM resample成S16格式,之后编码成功。附FFmpeg支持的音频编码器信息:

Dolby Digital: ac3
Dolby Digital Plus: eac3
MP2: libtwolame, mp2
Windows Media Audio 1: wmav1
Windows Media Audio 2: wmav2
AAC LC: libfdk_aac, aac
HE-AAC: libfdk_aac
Vorbis: libvorbis, vorbis
MP3: libmp3lame, libshine
Opus: libopus

参考资料:

1. FFMpeg学习(三) 音频处理基本概念

2. FFMpeg学习(六) 用libavfilter对视频尺寸进行裁切

3. https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio


推荐阅读
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 解决针织难题:R语言编程技巧与常见错误分析 ... [详细]
  • 在Android平台上,视频监控系统的优化与应用具有重要意义。尽管已有相关示例(如http:www.open-open.comlibviewopen1346400423609.html)展示了基本的监控功能实现,但若要提升系统的稳定性和性能,仍需进行深入研究和优化。本文探讨了如何通过改进算法、优化网络传输和增强用户界面来提高Android视频监控系统的整体效能,以满足更复杂的应用需求。 ... [详细]
  • 在更换电脑后,使用 Git Bash 运行 Python 时可能会遇到找不到 Python 解释器的问题。本文详细介绍了如何在 Windows 环境下通过 Bash Shell 调用不同版本的 Python,并成功运行 SRSPlayer HTTP 服务器。具体步骤包括配置环境变量、验证 Python 版本以及启动服务器的方法。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • SIoU Loss 的原理详解及代码实现分析
    本文详细解析了 SIoU Loss 的原理及其在边界框回归任务中的优势,并通过代码实现对其性能进行了深入分析。SIoU Loss 作为一种改进的损失函数,能够更有效地优化目标检测模型的边界框回归效果,提升模型的准确性和鲁棒性。文中还提供了具体的代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文将深入解析 Lumen 框架中的中间件机制,并提供实用的应用指南。我们将从官方文档出发,重点解读 5.3 版本中的相关内容,帮助开发者更好地理解和使用中间件功能。通过具体示例,探讨中间件在请求处理流程中的作用及其配置方法。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
author-avatar
贞娜gina88
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有