FFMPEG编译安装、简单使用

ffmpeg的aarch64-linux-gnu交叉编译 阅读详情

源码下载

地址: https://github.com/FFmpeg/FFmpeg

git clone https://github.com/FFmpeg/FFmpeg.git

编译和安装

  • 因为使用在板端编译,因此没有使用交叉编译链的部分。
  • 将如下内容复制到build.sh, 执行sh build.sh
./configure \
        --prefix="$PWD/install" \
        --enable-shared \
        --target-os=linux \
        --arch=aarch64 \
        --enable-gpl \
        --extra-libs=-ldl \
        --extra-cflags="-fPIC" \
        --extra-ldflags=-Wl,-Bsymbolic \
        --extra-libs="-lpthread -lm"

  • 如果没有报错,执行make -j4;make install
    • 以上版本工具有ffmpeg和ffprobe
    • 接口在install目录下的include和lib

API简单使用

源代码

xxxxxxxxxxxxxxxxxxxx.hpp

#ifndef FILE_2_FRAME_H__
#define FILE_2_FRAME_H__

#include <thread>
#include <string>
extern "C" {
	#include <libavformat/avformat.h>
}



class CFile2Frame {
public:
	
	static constexpr char *RED_START = (char*)"\033[1;31m";
	static constexpr char *GREEN_START = (char*)"\033[1;32m";
	static constexpr char *COLOR_END = (char*)"\033[0m";

	typedef void (*func_data)(char*, int, void*pUser);
	
public:
	CFile2Frame(const std::string &filePath);
	~CFile2Frame();

	int start();

	int videoFormatConversion();
	void file2FrameExecLoop(void);
	
	void loop();
	static unsigned frameNo_;
private:
	bool isExit_;
	std::thread *pff_;
	func_data frameCb_;

	std::string strfileNamePath_;
	//ffmpeg
	AVFormatContext *ic_{nullptr};
	AVDictionary *opts_{nullptr};
	AVPacket *pkt;

	bool initSucc  ;		/*初始化成功完成标志, 读帧准备前的初始化*/
	int VideoStreamIndex_;

		
	

};

#endif 

xxxxxxxxxxxxxxxxxxxxx.cpp

#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>


#include <file2Frame.h>

unsigned CFile2Frame::frameNo_=0U;


static void frameCallback(char *pdata, int size, void *pUser)
{
	if(pUser){
		// *this
	}

	printf("fn:%06d - frame_size:%d\n", ++CFile2Frame::frameNo_, size);
	
}

static double r2d(AVRational r)
{
	return r.den == 0 ? 0 : r.num / r.den;
}


CFile2Frame::CFile2Frame(const std::string &filePath):frameCb_(frameCallback),pff_(nullptr), isExit_(false),strfileNamePath_(filePath),
		initSucc(false), VideoStreamIndex_(0)
	
{
	pff_ = new std::thread(&CFile2Frame::file2FrameExecLoop,this);
	if(!pff_){
		printf( "create file2FrameExecLoop failure!!!"  "\n");
	}

	
	
	

}


CFile2Frame::~CFile2Frame()
{
	isExit_ = true;
	if(pkt){
		av_packet_free(&pkt);

		if(nullptr != ic_){
			avformat_close_input(&ic_); ic_ = nullptr;
		}
	}
}


void CFile2Frame::file2FrameExecLoop(void){
	int ret = 0;
	
	frameCb_  = frameCallback;
	

	pkt = av_packet_alloc();
	printf(  "开始从%s文件中分离帧数据****"  "\n", strfileNamePath_.c_str());
	while(!isExit_){
		if(!ic_ || !initSucc){
			goto C;
		}
		ret = av_read_frame(ic_, pkt);
		if(0 != ret){
			std::cout << RED_START << "Read Frame End!" << COLOR_END << std::endl;;
			frameNo_ = 0;
			getchar();

			int ms = 3000;
			long long pos = ms / 1000.0 * r2d(ic_->streams[pkt->stream_index]->time_base);
			av_seek_frame(ic_, VideoStreamIndex_, pos, AVSEEK_FLAG_BACKWARD |AVSEEK_FLAG_FRAME);
			continue;
			
		}
		static int frameNo = 0;
		
	//	if(pkt->stream_index == VideoStreamIndex_ ){printf("[No.%06d]size:%d\n", ++frameNo, pkt->size);};

		if(pkt->size){

			frameCb_( (char *)pkt->data, pkt->size, nullptr);
		}
		
C:
		usleep(50*1000);
		av_packet_unref(pkt);		//引用计数减1,, 为0时释放空间

	}

	
}



//build {g++ file2Frame.cpp  -I include -I . -L ./lib -lavcodec -lavdevice -lavfilter -lavutil -lpostproc -lswscale -lavformat  -lswresample -lpthread}
int CFile2Frame::start()
{
	av_dict_set(&opts_, "rtsp_transport", "tcp", 0);
	av_dict_set(&opts_, "max_delay", "500", 0);
	
	int ret  = avformat_open_input(&ic_, strfileNamePath_.c_str(), nullptr, &opts_);
	if(0 != ret){
		char buf[1024]{0};
		av_strerror(ret, buf, sizeof(buf)-1);
		std::cout << "file open failed: " << buf << std::endl;
		return -1;
	}

	avformat_find_stream_info(ic_, nullptr);

	int nTime = ic_->duration / AV_TIME_BASE;
	std::cout << "total time : " << nTime << std::endl;

	av_dump_format(ic_, 0, nullptr, 0);

	
	for(unsigned int i = 0; i < ic_->nb_streams;++i){
		AVStream *stream = ic_->streams[i];
		//video
		if(stream->codecpar->codec_type == AVMediaType::AVMEDIA_TYPE_VIDEO){
			VideoStreamIndex_ = i;

			printf("[No.%d] {codecid:%d, w:%d,h:%d, format:%d}\n", i, stream->codecpar->codec_id,
							stream->codecpar->width, stream->codecpar->height, stream->codecpar->format);

			printf("fps:%d, size:%d\n", stream->avg_frame_rate, stream->codecpar->frame_size);

			printf("\n");
		}
		

	}

	VideoStreamIndex_ = av_find_best_stream(ic_, AVMediaType::AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0); 
	initSucc = true;
}


void CFile2Frame::loop()
{
	while(!isExit_){
		usleep(100*1000);
	}
}
int main(int argc, char *argv[])
{
	auto pInv = std::make_shared<CFile2Frame>("./blue.mp4");
	if(pInv){
		pInv->start();
	}

	pInv->loop();

	return 0;
}


编译

g++ file2Frame.cpp -I. -I include -L lib -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lpostproc -lswresample -lswscale -lpthread

运行

开始从./blue.mp4文件中分离帧数据****
total time : 136
Input #0, mpeg, from '(null)':
  Duration: 00:02:16.76, start: 575.453000, bitrate: 3726 kb/s
    Stream #0:0[0x1e0]: Video: h264 (Main), yuv420p(progressive), 1920x1080, 90k tbr, 90k tbn
[No.0] {codecid:27, w:1920,h:1080, format:0}
fps:0, size:0

fn:000001 - frame_size:82093
fn:000002 - frame_size:22834
fn:000003 - frame_size:20793
fn:000004 - frame_size:19749
fn:000005 - frame_size:22469
fn:000006 - frame_size:18618
fn:000007 - frame_size:14481
fn:000008 - frame_size:18327
fn:000009 - frame_size:17599
fn:000010 - frame_size:17848
fn:000011 - frame_size:17835
fn:000012 - frame_size:18050
fn:000013 - frame_size:17740
fn:000014 - frame_size:17351
fn:000015 - frame_size:17392
fn:000016 - frame_size:17268
fn:000017 - frame_size:16904
fn:000018 - frame_size:16813
fn:000019 - frame_size:20473
fn:000020 - frame_size:17199
fn:000021 - frame_size:17412
fn:000022 - frame_size:17161
fn:000023 - frame_size:16997
fn:000024 - frame_size:16883
fn:000025 - frame_size:16717
fn:000026 - frame_size:16930
fn:000027 - frame_size:16866
fn:000028 - frame_size:16792
fn:000029 - frame_size:17012
fn:000030 - frame_size:20293
fn:000031 - frame_size:82470
fn:000032 - frame_size:22369
fn:000033 - frame_size:19886
fn:000034 - frame_size:19078
fn:000035 - frame_size:18911
fn:000036 - frame_size:18635

工具的简单使用

参数说明
-hhelp
-t duration设置处理时间,格式为hh:mm:ss
-ss position设置起始时间,格式为hh:mm:ss
-b:v bitrate设置视频码率
-b:a bitrate设置音频码率
-r fps设置帧率
-s wxh设置帧大小,格式为WXH
-c:v codec设置视频编码器
-c:a codec设置音频编码器
-ar freq设置音频采样率
  • MP4转MJPEG ./ffmpeg -i [你的mp4文件路径] -vf "fps=30" -q:v 9 out.mjpeg
  • 截取一段视频
ffmpeg -i blue.mp4 -ss 8 -t 3 -s 1280x720 -codec copy -f flv out.flv
-ss 开始时间:set the start time offset,单位秒,-t 持续时间 -s 分辨率。截取原视频中从第8秒开始,持续时间3秒的视频。输出分辨率1280x720
  • 解封装

ffmpeg -i blue.mp4 -codec copy -bsf: h264_mp4toannexb -f h264  out.264
-i blue.mp4:  是输入的MP4文件

-codec copy: 从mp4中拷贝

-bsf: h264_mp4toannexb: 从mp4拷贝到annexB封装

-f h264: 采用h264格式

out.264: 输出的文件

学习论坛

传送:https://superuser.com/questions/tagged/ffmpeg

【音视频处理】FFmpeg详解,命令行、源码、编译安装 本期我们讨论FFmpeg 1、FFmpeg命令行说明 2、FFmpeg代码结构 3、FFmpeg编译安装 阅读详情

相关推荐

FFmpeg 基础模块:下载编译与安装、常用命令、处理流程

FFmpeg 基础模块:容器相关的 API 操作

weixin_42136255的博客 1592

ffmpeg编译安装

Fmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

CltCj的博客 2269

FFmpeg下载、编译、安装

1、FFmpeg 下载、编译、安装 1.1、下载 新建个目录下载 FFMpeg 源码 下载命令:git clone https://git.ffmpeg.org/ffmpeg.git libavformat 用于各种音视频封装格式的生成和解析 libavutil 包含一些公共的工具函数; libavcodec 用于各种类型声音、图像编解码; libavdevice 对音视频设备做处理,采集 libavresample 对音频重采样 libavfilter 滤镜处理 libswresample 用于视频

ty13392186270的博客 1219

FFmpeg的安装、编译——教程及踩坑

FFmpeg的安装和编译,因为有两台电脑,安装和编译四处踩坑,边踩边总结在这里,持续更新~2019.06.29Ubuntu、Mac安装 Ubuntu下编译。

yinshipin007的博客 1082

Windows编译安装ffmpeg和sdl

ffmpeg和sdl在Windows上编译安装

huangjiazhi_的博客 1217

ffmpeg安装之linux编译安装

转发自白狼栈:查看原文 关于ffmpeg的安装,有的人可能要折腾很久,甚至折腾一个礼拜,究其原因,基本都是编译安装惹的祸。 我们提供4种安装方式,最复杂的莫过于centos7上的编译安装。 ffmpeg静态库下载安装 在mac上安装ffmpeg 在centos7上编译安装ffmpeg 使用docker安装ffmpeg 大家可以根据自己的喜好选择安装。 为什么说在 linux 上编译安装 ffmpeg 最复杂?因为编译之前我们要安装很多扩展库,每个人的环境不同,要安装的编解码库或多或少都有些区别。 lin

白狼栈 708

FFMPEG源码编译安装

介绍与准备 FFmpeg是一个强大的音视频编解码开源库。目前(2022/2/9)FFmpeg版本已经到了4+,支持多种平台。本文将讲解如何在Linux环境下编译安装FFmpeg。 在开始前首先做一些准备。 1.在FFmpeg官网下载FFmpeg的最新源码(4+) 2.准备Linux编译环境(Ubuntu16或其他Linux系统) 解压 解压下载好的FFmpeg压缩文件。 tar -xvf ffmpeg-snapshot.tar.bz2 解压完成后会得到一个ffmpeg文件夹。 编译与安装 先进入ffmp

PYJTLK的博客 6772

实战指南:如何优雅解决SpringBoot3与Mybatis-Plus的版本兼容性问题

本文深入解析SpringBoot3与Mybatis-Plus的版本兼容性问题,提供实战解决方案。通过Maven依赖排除策略、Gradle配置方案及自动配置覆盖策略,有效解决包冲突和初始化顺序问题,确保项目平稳升级。适用于开发者快速解决SpringBoot3与Mybatis-Plus的集成难题。

weixin_28432777的博客 597

FFmpeg 源码编译安装

FFmpeg 源码编译

升级打怪记录 1669

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 273

瑞萨单片机,把CS文件转换为CC

1、打开CC的软件: 点击坐上角的"START" 点击"Create New Project"的"GO": 导入工程: 如下图设置后,点击"Create" 2、进入到CC的开发界面: 可以看到原启动库文件以asm文件的方式直接出现在工程中: 删除新生成的main.c,保留导入的r_main.c(以你自己的代码为准): 注意添加所有的头文件路径: 点击"...

weixin_37611121的博客 1228

linux 安装 ffmpeg 包括静态包和编译安装

linux安装,找了半天各种技术文章,说最好编译安装,按照步骤安装编译环境编译成功了,但是使用的时候总要安装各种外部库,转码转不了等等问题......当然,如果想要ffmpeg命令全局可用,可以在bin目录加个链接。比如,分别执行如下命令,即可在/usr/bin目录下创建ffmpeg和ffprobe软链接。最后,删除/usr/local/bin/ffmpeg执行程序,你的可能不在这个地方,可以自己查看具体位置,whereis ffmpeg。最后无奈,卸载掉ffmpeg,去官网下载编译好的程序,尝试了一下。

托塔天王的博客 1万+

【3d打印】基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置

基于Klipper的3d打印远程上位机系统(Qt),klipper源码,通信解析,打印参数设置(启庞Kp3s V1)

共享IT之美,共创机器未来 3189

FFmpeg 编译安装和静态安装

FFmpeg 是一个领先的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创建的格式。本指南将详细介绍如何在 CentOS 8.5.2111 系统上从源代码编译并安装 FFmpeg 6.1.1 版本。从源代码编译安装可以确保您获得最新版本的功能,并可以根据您的特定需求进行定制。本博客主要依赖于生成,我通过 manus 给出的方案逐步运行并安装成功,并且我也对比了下安装和安装的差别。

m0_38031488的博客 1202

DataHub 架构设计与核心工作原理

DataHub 是一个第三代数据目录系统,专为现代数据栈设计,支持数据发现、协作、治理和端到端可观测性。其架构采用模型优先的设计理念,注重不同工具和系统之间的互操作性。

北斗云的博客 1223

Burpsuite系列安全渗透--自动扫描生成h5报告

第一章简述 Burpsuite是基于Java的用于web安全的工具,能够进行爬虫、代理、编码、密码爆破等任务,并支持对XSS漏洞、文件包含等漏洞的主动扫描或被动扫描。burpsuite2.0具体分为以下11个模块: Dashboard(仪表盘)——显示任务、实践日志等。 Target(目标)——显示目标目录结构的的一个功能。 Proxy(代理)——拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。 Intruder(...

魔都虫师的博客 2888

Jetson NX源码编译安装ffmpeg

Jetson NX源码编译安装ffmpeg教程

zhuangjiaquan的博客 1204

量化交易 米筐 因子分组打分(成长因子)

分组动手练习 在米筐上因子数据没有处理,提供的很多因子没有默认分类,存在一些因子没有的情况,我们就选择一些常见的因子。 价值因子 质量因子 成长因子(历史名称) pe_ratio return_on_invested_capital in_revenue pcf_ratio du_return_on_equity inc_eps pb_ratio return_on_asset_net_profit inc_total_asset market_cap return_on_equ

廷益_飞鸟的博客 932

Ubuntu20.04 编译安装 FFmpeg 详细教程

本文目录导航0.预备软件包0.1 FFmpeg0.2 SDL21.安装编译所需工具1.1 安装 aptitude1.2 安装 gcc、g++1.3 安装 yasm、nasm2.安装依赖库3.编译 FFmpeg4.配置 FFmpeg4.1 配置环境变量4.2 配置动态链接库 0.预备软件包 0.1 FFmpeg FFmpeg 源码下载地址:http://ffmpeg.org/download.h...

annjeff的博客 2万+

全球气候模式降尺度方法总结及其代码实现

简介总结各类型气候模式降尺度方法

WW、forever的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ffmpeg在ubuntu的安装和编译

环境都准备好了直接开始 1.获取ffmepg源码: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 或者http://www.ffmpeg.org/download.html 自己访问下载(tar xvf xxx.tar.gz) 2. ./configure --prefix=/usr/local/ffmpeg --e...

chrycoder的博客 1709

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ffmpeg自动手动编译安装

本例以android-ndk-r10e为例 vi /etc/profileexport NDK_HOME=/root/ffmpeg/android-ndk-r10e export PATH=PATH:PATH:PATH:NDK_HOMEsource /etc/profilegit clone https://code.videolan.org/videolan/x264.git cd x264/ ./configure --prefix=/root/ffmpeg/outputx264 --enable-sh

芃华的博客 1371

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Ubuntu下编译安装Ffmpeg

1. git clone ffmpeg: git clone https://git.ffmpeg.org/ffmpeg.git 会有一个ffmpeg目录,cd进去后就可看到常用的模块。 2.安装相关依赖库文件: sudo apt install yasm libsdl2-dev libx264-dev libx265-dev libfdk-aac-dev ./config...

手写我对你的温柔 1674

ubuntu 编译安装ffmpeg

1.FFmpeg编译 1.1.安装yasm 这里我是直接通过ubuntu包安装的,当然也可以通过编译源码来安装。 sudo apt-get install yasm 1.2.下载FFmpeg git clone https://git.ffmpeg.org/ffmpeg.git 1.3.配置、编译FFMPEG (1) apt-get install yasm    //这儿需要先...

qq_31186123的博客 4459

macOs上交叉编译ffmpeg及安装ffmpeg工具

本文详细介绍了在MacBook Pro(macOS 14.6.1)上编译安装FFmpeg的完整过程。首先下载并解压FFmpeg 7.0.2源码,解决编译时遇到的nasm/yasm依赖问题。然后重点说明了Android平台的交叉编译配置,包括NDK路径设置、环境变量配置和自定义编译脚本的编写。最后展示了如何在macOS系统上安装预编译的FFmpeg工具链,包括环境变量配置和权限问题的解决方法。整个过程涵盖了从源码编译到工具安装的完整流程,为在macOS系统上使用FFmpeg提供了详细指导。

wangyongyao1989的博客 1385

FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg

FFmpeg支持Linux、macOS、Windows、Android等系统,其中Linux系列包括Ubuntu、Debian、Mint、CentOS、RHEL、Fedora等。欧拉系统基于CentOS的源码开发,运行环境兼容CentOS。

aqi00的博客 2699
上一篇: 深度相机评估
下一篇: Linux性能系统学习之监控工具
帘下有白绿
博客等级 码龄12年 165粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值