MP4视频播放问题(有声音无图像)分析与解决——FFmpeg视频处理教程

news/2024/11/20 11:36:31/

项目开发中,测试人员反应存在部分视频无法正常播放,赶紧去查看什么原因:发现有些视频只有声音没有影像,但是这些视频下载到本地是可以正常播放的,此时脑海中就大概知道了什么问题:应该是视频本身编码的问题,于是就去查看视频编码「可以正常播放的视频编码为H.264,有声音无影像的视频编码为HEVC

可以正常播放视频编码

在这里插入图片描述

有声音无影像的视频编码

在这里插入图片描述

为了验证这个想法的准确性,先使用工具将视频编码转为H.264,再上传,果然可以正常播放
问题找到了,开始解决吧,实际中也不可能让用户自己去转视频编码后再来上传吧,所以就在程序中对上传的视频进行转码操作(注意:视频较大的时候转码相对也比较慢,建议使用异步队列来执行相关操作)


我是使用FFmpeg来处理视频的,下面是简单的介绍
在这里插入图片描述
如果你还没安装,可以根据官方文档 先完成安装。

说明

ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中获取。它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。
ffmpeg从该选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)中读取-i,并写入任意数量的由以下选项指定 的输出“文件”一个普通的输出网址。在命令行上找到的所有不能解释为选项的内容都被视为输出URL。

每个输入或输出URL原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。流的允许数量和/或类型可能会受到容器格式的限制。自动地或通过-map选项选择要从哪个输入流进入哪个输出(请参阅“流选择”一章)。

要在选项中引用输入文件,必须使用其索引(从0开始)。例如,第一个输入文件是0,第二个输入文件是,1等等。类似地,文件中的流由它们的索引引用。例如,2:3引用第三输入文件中的第四流。另请参阅“流说明符”一章。

通常,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每次出现都应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细级别),应首先指定。

不要混合输入文件和输出文件–首先指定所有输入文件,然后指定所有输出文件。也不要混用属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并且在文件之间重置。

  • 要将输出文件的视频比特率设置为64 kbit / s,请执行以下操作:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
  • 要将输出文件的帧速率强制为24 fps,请执行以下操作:
ffmpeg -i input.avi -r 24 output.avi

常用的命令行参数
  • -c:指定编码器
  • -c copy:直接复制,不经过重新编码(这样比较快)
  • -c:v:指定视频编码器
  • -c:a:指定音频编码器
  • -i:指定输入文件
  • -an:去除音频流
  • -vn: 去除视频流
  • -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
  • -y:不经过确认,输出时直接覆盖同名文件。
常用的几种用法
  • 查看视频文件信息
    查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。
ffmpeg -i input.mp4

面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。

ffmpeg -i input.mp4 -hide_banner
  • 转换编码格式
    转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264,所以只需指定输出文件的视频编码器即可。
ffmpeg -i [input.file] -c:v libx264 output.mp4
  • 裁剪
    裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。
ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
参考连接

FFmpeg libav tutorial
Digital video introduction


http://www.ppmy.cn/news/473147.html

相关文章

输入 输出(一)

目录 前言 一、输入 输出 二、依据 1.格式声明 2.基本的格式字符 3.附加的格式说明符 ①输出的附加格式说明符 ②输入的附加格式说明 三、printf输出语句 ①“格式控制”是用双引号括起来的一个字符串,称为格式控制字符串,简称格式字符串。包括…

输入输出.

什么是输入输出 计算机归根结底是为人类服务的,这就要求计算机必须提供某种机制使得人可以向计算机发出命令或操纵计算机。也就说计算机与人之间必须存在某种沟通的机制。 这种沟通的机制就是计算机的输入输出机制。 输入提供的是一个“人→计算机”的通道。即人或…

视频输入输出3-打开关闭视频或捕捉设备

打开视频文件或捕获设备或 IP 视频流进行视频捕获。 virtual bool cv::VideoCapture::open(const String &filename,int apiPreference = CAP_ANY) 这是一个重载的成员函数,是为了方便而提供的。 它与上述函数的不同之处仅在于它接受的参数。 参数同构造函数 VideoCapt…

解决HDMI屏幕有视频但无声音输出

*****出现HDMI无声音输出问题 问题:发现系统在连接HDMI接口输出时,只有图像出现,没有声音 分析:HDMI接口可同时传送音频和影音信号。接上HDMI输出后,系统有两个声卡,一 个是背后输出的,即REALTE…

视频输入输出常用接口

转自http://hi.baidu.com/junlin8848/item/1a8e2bd7fc8b1d312b35c781 随着视频清晰度的不断提升,这也促使我们对高清视频产生了浓厚的兴趣,而如果要达某些清晰度的视频就需要配备相应的接口才能完全发挥其画质。所以说视频接口的发展是实现高清的前提&am…

输入输出模式

使用语言:JAVA 参考正解代码如下: import java.util.*; class Main{ public static void main(String args[]){ int m; double sum,n; Scanner sc new Scanner(System.in); while(sc.hasNext()){ nsc…

视频流输入管理

视频流输入管理模块的实现,处于比较上层的位置,对上,接收设web界面设置的参数 ,对下 ,要适配不同的平台,因此,在设计上,使用了大量的函数指针,使用C语言面向对象的方法。 主要的设置函数方法有: 得到视频输入支持的特性: int (*getCaps)(struct VideoInput *thiz…

视频输出设备

2.3.1 视频输出设备 2.3.1.1 MTRR的设置 强烈建议你检查你的MTRR注册是否正确的设定了,因为他们能极大的提高性能。 运行cat /proc/mtrr: --($:~)-- cat /proc/mtrr reg00: base0xe4000000 (3648MB), size 16MB: write-combining, count9 reg01: base0xd8000000 …