FFMPEG编译安装、简单使用

目录

  • 源码下载
  • 编译和安装
  • API简单使用
    • 源代码
    • 编译
    • 运行
  • 工具的简单使用
  • 学习论坛

源码下载

地址: 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
    • 以上版本工具有ffmpegffprobe
    • 接口在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_;//ffmpegAVFormatContext *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];//videoif(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/sStream #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:0fn: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电梯安全远程监控系统的主要作用和意义

电梯是现代城市生活中必不可少的交通工具&#xff0c;为了保证其安全可靠的运行&#xff0c;电梯运行监测系统应运而生。本文将介绍电梯安全远程监控的工作原理、重要性 一、电梯安全远程监控系统的作用   ◆实时监控和故障预警&#xff1a;电梯安全远程监控系统可以实时监测…

加强网站稳定性!学习如何进行高效压力测试!

前言 1、什么是压力测试&#xff1f; 软件压力测试是一种基本的质量保证行为&#xff0c;它是每个重要软件测试工作的一部分。 软件压力测试的基本思路很简单&#xff1a;不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试…

Pandas进阶:文本处理

引言 文本的主要两个类型是string和object。如果不特殊指定类型为string&#xff0c;文本类型一般为object。 文本的操作主要是通过访问器str 来实现的&#xff0c;功能十分强大&#xff0c;但使用前需要注意以下几点。 访问器只能对Series数据结构使用。 除了常规列变量df.c…

从0开始学习JavaScript--JavaScript 集成测试

JavaScript集成测试是确保整个应用程序组件协同工作的关键环节。通过模拟真实环境&#xff0c;集成测试能够发现不同组件之间的潜在问题&#xff0c;确保系统的稳定性和可靠性。本文将深入探讨JavaScript集成测试的核心概念、工具使用以及最佳实践&#xff0c;并通过丰富的示例…

springboot多文件上传

Spring Boot 是一个强大的、灵活的、开发效率高的框架&#xff0c;适合开发各种类型的 Web 应用或微服务&#xff0c;是现代化的企业级开发的首选。 接口编写 可以使用Spring Boot的MultipartResolver来实现上传多文件。 在pom.xml文件中添加以下依赖&#xff1a; <depende…

1.2 Ubauntu 使用

一、完成VMware Tools安装 双击 VMwareTool 打开 Ubuntu 终端快捷键 AltControlT 切换汉语的快捷键是Alt空格 ls 打印出当前所在目录中所有文件和文件夹 cd 桌面 进入桌面文件夹 sudo ./vmware-install.pl 安装tool&#xff0c;输入之前设置的密码。 地址默认&#xff0c;按…

华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)

题目描述: 现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,…

UI自动化测试工具有哪些优势?

UI自动化测试工具通过提高测试效率、覆盖率&#xff0c;减少测试时间和成本&#xff0c;以及支持持续集成等方式&#xff0c;为软件开发团队提供了一系列重要的优势&#xff0c;有助于提升软件质量和开发效率。 自动化执行&#xff1a;UI自动化测试工具可以模拟用户与应用程序的…

HarmonyOS脚手架:UI组件之文本和图片

前言 关于HarmonyOS脚手架&#xff0c;本篇是系列的第二篇&#xff0c;主要实现UI组件文本和图片的常见效果查看&#xff0c;本身功能特别的简单&#xff0c;其目的也是很明确&#xff0c;方便大家根据效果查看相关代码实现&#xff0c;可以很方便的进行复制使用&#xff0c;当…

TCP三次握手过程

什么是TCP tcp是一个面向连接的、可靠的、基于字节流的传输层通信协议 面向连接&#xff1a;TCP连接是一对一的&#xff0c;不能实现一对多或多对一&#xff0c;TCP在通信前要首先建立连接&#xff0c;连接成功后才能开始进行通信可靠的&#xff1a;TCP连接要保证通信过程的可靠…

iOS 版 ONLYOFFICE 文档 v7.4已更新!

iOS 版 ONLYOFFICE 文档 v7.4已更新 全新版本的免费 ONLYOFFICE 文档管理与编辑应用现已在 iOS 设备上推出。继续阅读以了解有关本次更新的信息&#xff0c;也可以在本文中找到应用的下载链接。 关于 ONLYOFFICE 文档 ONLYOFFICE 文档是一款适合手机与平板电脑的移动端应用套件…

springboot中@Builder注解的详细用法实例,跟数据库结合。

在Spring Boot中&#xff0c;Builder注解是Lombok库提供的一个注解&#xff0c;用于生成带有Builder模式支持的构造器方法。通过Builder注解&#xff0c;可以简化对象的创建过程&#xff0c;特别适用于需要设置多个属性的情况。 下面是一个使用Builder注解的示例&#xff1a; …

基于python的FMCW雷达工作原理仿真

这篇文章将介绍如何使用python来实现FMCW工作原理的仿真&#xff0c;第1章内容将介绍距离检测原理&#xff0c;第2章内容会介绍速度检测原理。 第1章 第1部分: 距离检测原理 调制的连续波雷达通常也被叫做调频连续波&#xff08;FMCW&#xff09;雷达是一个使用频率调制来测量…

腾讯云避坑——无法远程root登录

因为各种原因&#xff0c;最近需要使用腾讯云来代替阿里云。 但在ubuntu18/20的服务器中&#xff0c;我使用另一个电脑试图用scp命令来拷贝服务器中的一些文件&#xff0c;命令为: scp root服务器ip:文件目录 本地目录但一直显示密码错误。 原因是腾讯云ubuntu系统在创建时并不…

BLIoTLink工业协议转换软件功能和使用教程

1.功能简介 BLIoTLink 是一款各种 PLC 协议、Modbus RTU 、Modbus TCP、DL/T645 等多 种协议转换为 Modbus TCP、OPC UA、MQTT、BACnet IP、华为云 IoT、亚 马逊云 IoT、阿里云 IoT、ThingsBoard、钡铼云 IoT 等协议的软件。 BLIoTLink 下行支持&#xff1a;各种 PLC 协议、Mod…

centos上安装并持久化配置LVS

1 实验背景 1&#xff09;系统版本&#xff1a;centos7.8 2&#xff09;虚拟机&#xff1a;3个centos虚拟机&#xff0c;&#xff08;其中一个做Director Server,另外两个做Real Server) 3) LVS大致有NAT ,DR ,Tun这三种模式&#xff0c;这里搭建一个典型的DR模式的LVS Direc…

【漏洞复现】大华智慧园区综合管理平台deleteFtp接口远程命令执行

漏洞描述 大华智慧园区综合管理平台deleteFtp接口存在远程命令执行,攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益…

C 标准库 <locale.h>

C 标准库 <locale.h> locale.h 头文件定义了特定地域的设置&#xff0c;比如日期格式和货币符号。接下来我们将介绍一些宏&#xff0c;以及一个重要的结构 struct lconv 和两个重要的函数。 库宏 下面列出了头文件 locale.h 中定义的宏&#xff0c;这些宏将在下列的两…

VSC++=》 拆解整数对号入座重组

void 拆解整数对号入座重组(int& 数, bool 选 true) {int 对号[10]{}, j 选 ? 9 : 0, 反 0, 基 1;while (数)对号[数 % 10], 数 / 10;if (选)while (j > 0)if (对号[j])数 * 10, 数 j, (反 ? 基 * 10 : 0), 反 基 * j, --对号[j]; else --j;else while (j < …

VSC++=》 友数对友质数()

void 友数对友质数() {//缘由https://bbs.csdn.net/topics/396498706?page1#post-411382586int aa 2, aaa 20; while (aa * aaa < 119)if (判断质数(aa * aaa - 1))cout << aa << ends << aaa << ends << (aa*aaa - 1) << endl, aaa…