logo头像

技术引领生活!

ubuntu编译FFMPEG和ffplay

本文于2045天之前发表,文中内容可能已经过时。

最近突然又想研究音视频了,当然作为音视频领域必备技能FFMPEG是要了解的,本文从编译开始,希望这次能有点建树…

下载源码

到官网上下载,FFMPEG官网
推荐使用git

1
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

Linux环境

准备

  1. 不管三七二十一直接开干
    1
    ./configure 

提示错误

1
sudo apt install yasm
  1. 安装SDL
    1
    sudo apt install libsdl2-dev 
    安装完后再配置会自动的能产生ffplay

配置

1
./configure --enable-ffplay

如果想支持ssl请加上 –enable-openssl 并且安装 openssl, libssl-dev

编译

为了加快编译速度,加上-j参数

1
make -j8

安装

1
sudo make install

测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
//命令行测试:ffmpeg -version
//文件名: helloFFmpeg.c
//编译命令: gcc -o helloFFmpeg helloFFmpeg.c -lavcodec -lavdevice -lswresample -lavformat -lavcodec -lavutil -lswscale -lGL -lm -lz -lpthread `pkg-config --cflags --libs sdl2`
//

#include "libavcodec/avcodec.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("%s", avcodec_configuration());
return 0;
}

Qt 相关

首先说下环境,使用ubuntu 21.10 Qt5.15.12 要安装以下两个包,好多教程还使用gstream0.1 或者 gstream-ffmpeg(还要额外添加源,烦人),终于一阵乱撸发现可以通过以下命令解决

先测试Qt的多媒体后端是否好用

1
gst-launch-1.0 playbin uri=file:///home/path/to/video/Videos/web.mp4

如果不行则运行以下命令,然后重复上一步,直至能播放了才行

1
sudo apt install gstreamer1.0-libav ubuntu-restricted-extras

测试程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QMediaPlayer *player = new QMediaPlayer;
QVideoWidget* videoWidget = new QVideoWidget;
videoWidget->setMinimumSize(500, 480); // 视频窗口大小

player->setMedia(QUrl::fromLocalFile("/path/test.mp4"));
player->setVolume(50);

player->setVideoOutput(videoWidget);
videoWidget->show();
player->play();

return a.exec();
}

Window环境

使用msys2编译

网上大部分都是使用msys2环境编译,这个不再表述了

使用Qt 的mingw环境编译

  1. 安装git
    主要是为了能够运行sh文件

  2. 配置依然采取常用配置

    1
    ./configure
  3. 编译

1
mingw32-make -j8

此时就会发现编译到最后的avcodec 时会报错, 根据打印结果看是字符串截断了(他喵的msys2没这个问题),大概显示以下内容

1
liba: No such file or directory
  1. 解决
    经过搜索在Build fails on Windows due to command line truncation找到解决方案:修改 ffbuild/library.mak 文件

修改前

1
2
3
4
$(SUBDIR)$(LIBNAME): $(OBJS)
$(RM) $@
$(AR) $(ARFLAGS) $(AR_O) $^
$(RANLIB) $@

修改后(cat objs.txt 这一句可选)

1
2
3
4
5
6
$(SUBDIR)$(LIBNAME): $(OBJS)
$(RM) $@
$(file >objs.txt,$^)
cat objs.txt
$(AR) $(ARFLAGS) $(AR_O) @objs.txt
$(RANLIB) $@

运行还是会出问题,后来改用单线程编译OK!

1
mingw32-make

PS

一些有用的链接
ffmpeg-makefile编译分析
跟我一起写 Makefile(四)
如何调试MAKEFILE变量

支付宝打赏 微信打赏

您的支持是我前行的动力!