FFMPEG(一)使用初探

【FFmpeg】FFmpeg 帮助文档使用 执行如下命令 , 将完整帮助信息导出到 ffmpeg_h_full.txt 文件中 , 这个帮助文档有 1001 10011001 KB , 放到博客资源中了;将 ffmpeg 基本信息输出到文件中 : 将信息输出到文件中 , 使用 > 符号 , 后面跟上文件名称 , 就会将信息输出到该文件名对应的目录中;将 FFmpeg 高级帮助信息导出到 ffmpeg_h_long.txt 文件中;三种帮助信息的关系 : 所有信息 包含 高级信息 , 高级信息 包含 基本信息;二、ffplay 命令帮助文档。 阅读详情
本系列文章的重要参考来源是雷神的博客。
使用FFMPEG的主要流程如下:

av_register_all()->avformat_open_input()->av_find_stream_info()->avcodec_find_decoder()->avcodec_open()->av_read_frame()->loop{get packet->avcodec_decode_video2()}->end

FFMPEG打开媒体的的过程开始于avformat_open_input,这中间会涉及到输入输出结构体AVIOContext和URLProtocol结构体,每种输入协议都会定义一个URLProtocol变量,这里会定义url_open等函数。


如果说,在Windows平台上开发相关的程序,可以使用另一个开源库SDL,该开源库在Android中的路径为prebuilts/misc/windows/sdl2/,使用SDL的基本流程如下:

SDL_init()->SDL_SetVideoMode()创建出SDL_Surface->SDL_CreateYUVOverlay()创建出SDL_Overlay->loop{SDL_DisplayYUVOverlay()->decode->YUV->送给SDL_Overlay}->到显示器显示

其中SDL_Surface就是使用SDL的时候弹出的那个窗口。在SDL1.x版本中,只可以创建一个SDL_Surface。

SDL_Overlay用于显示YUV数据。一个SDL_Overlay对应一帧YUV数据。
SDL_Rect用于确定SDL_Overlay显示的位置。注意:一个SDL_Overlay可以指定多个不同的SDL_Rect,这样就可以在SDL_Surface不同位置显示相同的内容。

下面以一个音频播放的例子,说明代码实现流程。

static Uint8 *audio_chunk; 
static Uint32 audio_len; 
static Uint8 *audio_pos; 

void fill_audio(void *udata,Uint8 *stream,int len){ 
if(audio_len==0) /* Only play if we have data left */ 
return; 
len=(len>audio_len?audio_len:len); /* Mix as much data as possible */ 

SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME); 
audio_pos += len; 
audio_len -= len; 
} 

int main(int argc, char* argv[]) 
{ 
AVFormatContext *pFormatCtx; 
AVCodecContext *pCodecCtx; 
AVCodec *pCodec; 
char url[]="WavinFlag.aac";

av_register_all(); 
avformat_network_init(); 
pFormatCtx = avformat_alloc_context(); 
//Open 
avformat_open_input(&pFormatCtx,url,NULL,NULL);
// Retrieve stream information 
av_find_stream_info(pFormatCtx)<0);

// Find the first audio stream 
for(i=0; i < pFormatCtx->nb_streams; i++) 
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){ 
audioStream=i; 
break; 
} 
// Get a pointer to the codec context for the audio stream 
pCodecCtx=pFormatCtx->streams[audioStream]->codec; 

// Find the decoder for the audio stream 
pCodec=avcodec_find_decoder(pCodecCtx->codec_id); 
// Open codec 
avcodec_open2(pCodecCtx, pCodec,NULL)<0);

AVPacket *packet=(AVPacket *)malloc(sizeof(AVPacket)); 
av_init_packet(packet); 

AVFrame *pFrame; 
pFrame=avcodec_alloc_frame(); 

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER);
SDL_AudioSpec wanted_spec; 
wanted_spec.freq = out_sample_rate; 
wanted_spec.format = AUDIO_S16SYS; 
wanted_spec.channels = out_channels; 
wanted_spec.silence = 0; 
wanted_spec.samples = out_nb_samples; 
wanted_spec.callback = fill_audio; 

//Swr 
struct SwrContext *au_convert_ctx; 
au_convert_ctx = swr_alloc(); 
au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,
in_channel_layout,pCodecCtx->sample_fmt , pCodecCtx->sample_rate,0, NULL); 
swr_init(au_convert_ctx); 

//Play 
SDL_PauseAudio(0); 
wanted_spec.userdata = pCodecCtx; 
SDL_OpenAudio(&wanted_spec, NULL);

while(av_read_frame(pFormatCtx, packet)>=0){ 
if(packet->stream_index==audioStream){ 
avcodec_decode_audio4( pCodecCtx, pFrame,&got_picture, packet);
if ( got_picture > 0 ){ 
swr_convert(au_convert_ctx,&out_buffer, MAX_AUDIO_FRAME_SIZE,(const uint8_t **)pFrame->data , pFrame->nb_samples);
} 

//Set audio buffer (PCM data) 
audio_chunk = (Uint8 *) out_buffer; 
//Audio buffer length 
audio_len =out_buffer_size; 

audio_pos = audio_chunk; 

while(audio_len>0)//Wait until finish 
SDL_Delay(1); 
} 
av_free_packet(packet); 
} 

swr_free(&au_convert_ctx); 

SDL_CloseAudio();//Close SDL 
SDL_Quit(); 

av_free(out_buffer); 
avcodec_close(pCodecCtx); 
av_close_input_file(pFormatCtx); 

return 0; 
} 

对上面代码的简单理解,主要是如下三点:

1)以AVFormatContext、AVCodecContext和AVCodec为核心变量的构建输入源解码环境,经decode函数将解码的码流放入AVFrame变量,不过在解码过程中还要用到一个AVPacket中间变量,应该是Track数据容器。
2)SwrContex用于处理源音频格式向目标音频格式的转换。
3)SDL相关通过SDL_AudioSpec变量描述播放参数和音频流传输回调函数,解码器与回调函数之间通过全局变量协调音频流播放完成的节奏,其中每次解码的buffer大小固定的,用av_samples_get_buffer_size根据输入输出音频参数计算。

附录:
SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能。
一、FFmpeg简介 一、FFmpeg简介 1. ffmpeg/ffplay/ffprobe 1.1 概念 ffmpeg: Hyper fast Audio and Video encoder 超快音视频编码器 ffplay: Simple media player 简单媒体播放器 ffprobe: Simple multimedia streams analyzer简单多媒体流分析器 1.2 帮助文档 ffmpeg ◼基本信息:ffmpeg -h ◼高级信息:ffmpeg -h long ◼所有信息:ffmpeg -h 阅读详情

相关推荐

FFmpeg使用教程及常见示例

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。

技术引领业务创新 7万+

ffmpeg -progress读取进度

- 使用文件存储进度 实例命令:ffmpeg -i video.mp4 -progress t.txt v.mpeg 进度文本的内容节选: frame=98 fps=0.00 stream_0_0_q=31.0 bitrate=4915.2kbits/s total_size=2359296 out_time_us=3840000 out_time_ms=3840000 out_time=00:00:03.840000 dup_frames=0 drop_frames=0 speed=7.63x progr

jm19920911的博客 4625

【FFmpeg学习】Visual Studio 2019 使用 ffmpeg 详细方法

目录 1. 下载FFmpeg编译好的Windows版本 2.VS2019配置ffmpeg 3. Windows控制台使用ffmpeg命令 1. 下载FFmpeg编译好的Windows版本 地址如下: Download FFmpeg 点击如下: 选择 shared 2.VS2019配置ffmpeg 比如:你下载上述的编译好的 ffmpeg 版本路径为: C:\ffmpeg\ffmpeg-4.4.1-full_build-shared 1)右键项...

mike_jun的博客 1万+

获取ffmpeg转码的实时进度

本文记录查看 ffmpeg 进行转码时的实时进度。使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c。

明天你好的博客 4231

FFmpeg使用教程(一)-windows安装配置ffmpeg

ffmpeg是一个开源的音视频转码工具,它提供了录制、转换以及流化音视频的完整解决方案,可以转码、压制、提取、截取、合并、录屏等。 一、下载FFmpeg 下载地址:http://ffmpeg.zeranoe.com/builds/ 根据你的系统选择下载: 下载 二、下载好后解压到你想安装的文件目录下,我的安装目录是D:\dev\app\ffmp...

菜菜的博客 5965

Android 使用FFmpeg播放视频(一)编译FFmpeg

在现今这个阶段,越来越多的app会涉及到音视频,那么学会使用ffmpeg就很有必要了。在这个系类中将讲解如何把ffmpeg编译成动态库,以及使用ffmpeg实现音视频播放和音视频的采集。 编译环境 Linux/Ubuntu/centos都行 在windows环境下可以安装虚拟机或者购买一个云主机,作者在金山云购买的一个Ubuntu主机。 准备工作 下载配置ndk,下载ffmpeg并解压。 ...

Y_xiaohe1234的专栏 2575

ffmpeg-progressbar-cli 使用教程

ffmpeg-progressbar-cli 使用教程 1. 项目的目录结构及介绍 ffmpeg-progressbar-cli 是一个为 FFmpeg 提供彩色进度条的工具。以下是该项目的目录结构及其介绍: ffmpeg-progressbar-cli/ ├── bin/ │ └── ffmpeg-bar # 启动文件 ├── lib/ │ └── index.js ...

gitblog_00015的博客 577

【ffmpeg】ffmpeg命令工具的使用

本文主要阐述了: 1.ffmpeg特点 2.ffmpeg命令行工具的获取 3.ffmpeg.exe的使用 4.ffplay.exe的使用

MichaelKongChina的博客 1340

终极指南:如何使用progress监控视频转码进度与FFmpeg集成

想要实时监控视频转码进度,避免漫长等待的焦虑?progress工具就是你的完美解决方案!作为一款轻量级的Linux命令行工具,progress能够实时显示文件复制、移动和数据处理任务的进度,包括**视频转码进度监控**、完成百分比、预估时间和吞吐量。 ## 🔍 什么是progress工具? progress(原名cv)是一款专门用于监控核心工具命令进度的实用程序。它能够自动检测系统中运行的c

gitblog_00103的博客 797

ffmpeg-progressbar-cli:FFmpeg的彩色进度条

ffmpeg-progressbar-cli FFMPEG-进度-CLI是C 0 L O, - [RËd进度棒材。 只需使用ffmpeg-bar而不是ffmpeg 。 内容 安装 $ npm install --global ffmpeg-progressbar-cli 用法 安装过程将ffmpeg-bar命令添加到您的系统。 这是一个透明的包装器,将所有命令传递给ffmpeg 。 要使用它,只需启动ffmpeg-bar而不是ffmpeg ,或在脚本内用ffmpeg-bar替换ffmpeg 。 只要没有遇到错误, ffmpeg-bar的输出将包含一个进度条,估计到完成过程的时间以及一个

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

FFmpeg初探(一)

ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 本章主要介绍一下ffmpeg工程包含的三个exe的使用方法。 ffmpeg的官方网站是:http://ffmpeg.org/ 编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持步):http://ffmpeg.zeranoe.com/builds/ 该网站中的FF...

优快云的博客 809

企业微信-审批控件中的外部选项的应用全流程完美解决方案

完美解决企业微信所有JS-SDK调用问题 完美解决苹果和PC端不适配的问题

qq_45195039的博客 5870

ffmpeg视频编解码 demo初探(一)(包含下载指定windows版本ffmpeg)分离视频文件中的视频流每一帧YUV图片

我们把ffmpeg可执行文件和动态库文件拷贝进来,然后执行那俩脚本文件,就能播放.aac文件和YUV文件了,不过貌似是播放视频的,我们生成的单帧文件,所以就只能播放出第一帧。然后下下来解压,把里面的一些东西拷贝到我们项目目录中,主要就是头文件,静态库文件,动态库文件,其中动态库文件注意要放在项目。然后到项目根目录查看,发现多了个video目录,里面有一个.aac文件和很多YUV文件,除此之外,还有俩.bat脚本文件,我没有用博主的,直接找方法自己编译了一个,不过是4.4版本的,不知道兼容不兼容。

Dontla的博客 2648

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

把数据库事务边界握在手里:ABAP 里的 COMMIT CONNECTION 与 ROLLBACK CONNECTION 深度拆解

与表面是两条很短的语句,背后却牵动了连接管理、数据库 LUW、SAP LUW、隐式提交、游标生命周期、GTT 平台差异等一整片工程现实。把它们用对,你就能在不破坏主业务事务的前提下,实现跨库写入、审计落库、隔离型日志、数据集成落地等一系列“看似矛盾”的目标;用错了,它们也会悄无声息地制造一致性缺口,让问题在高峰期以 dump 或数据异常的方式爆出来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1841

YUV格式初探(一)---ffmpeg解码之后的NV12格式进行裁剪

将ffmpeg解码视频出来的NV12格式的视频帧进行裁剪, 亲测可用。 /* 函数功能:     通过操作像素对NV12格式的一帧图片进行剪切 */ int rkNV12_cut_nv12(unsigned char * srcImage, int srcW, int srcH,                     unsigned char *destImage, int dstw,...

倒骑毛驴的博客 3244

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)仿真建模过程。主要内容包括:PMSM电机参数设置、Clarke/Park变换模块设计、电流环PID控制器构建、SVPWM调制实现等关键步骤。教程提供了完整的建模流程、参数配置建议和仿真调试方法,并给出了PID整定技巧和进阶优化方向。通过该模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技术,为伺服系统、电动汽车驱动等应用领域提供仿真基础。教程还推荐了使用PIDTuner工具进行参数优化,并提出了加入负载扰动

amy_mhd的博客 644

FFmpeg初探——基于FFmpeg的图片合成视频

前言商家在发布商品的时候,大部分情况下是没有视频的,这样往往会造成商品展示不全等问题,而视频制作又比较麻烦,为了解决此痛点,我们需要提供一键合成视频的功能。之所以选择 FFmpeg,是因为...

大转转FE 9876

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

DW1000开发笔记(一)DW1000芯片概览

一、DW1000介绍 DW1000(官方网站)是一个完全集成的低功耗射频收发器,遵循IEEE 802.15.4-2011 超宽带标准。它可以被用于双向测距或者TDOA定位系统中,精度为10cm。它使用了从3.5Ghz-6.5Ghz的6个射频频段,支持100kbps、850kbps、6.8Mbps的数据速率,并且可以在多径环境下进行处理,所以可在高反射的环境下应用。 DW1000内部最高层次的概览图如下: 二、DW1000的引脚和接口 DW1000芯片使用QFN-48封装,引脚图如下: DW1000内部

Mculover666的博客(嵌入式) 1万+

基于FFmpeg的Java视频Mp4转GIF初探

本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。

夜郎King的博客 1万+

Arcgis中的模型构建器(ModelBuilder)技术之批量图层转KML

这段时间全省各地都在开展耕地流出图斑整改恢复工作,期间或多或少都需要村委会协助摸排举证,除了举证软件外,奥维、外业精灵等软件想必大家接触得也很多。这就经常需要我们转kmz文件给业主或者摸排人员,那么有没有什么方法在arcgis下快速批量转kmz文件呢,今天就介绍一下如何在模型构建器(ModelBuilder)构建批量图层转KML的模型。

weixin_44671081的博客 1325

ffmpeg基础使用

参考ffmpeg常用命令ffmpeg参数中文详细解释[总结]FFMPEG视音频编解码零基础学习方法 一、安装 打开https://ffmpeg.zeranoe.com/builds/,该网站中的FFMPEG分为3个版本:Static,Shared,Dev。 前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序

JineD的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ffmpeg-python库的使用翻译(一)

原文地址:https://github.com/kkroening/ffmpeg-python,本文为google翻译+部分人工翻译,希望能对大家有用。 ffmpeg-python:FFmpeg的Python绑定 总览 已经有大量的Python FFmpeg包装器,但是它们似乎缺乏复杂的过滤器支持。ffmpeg-python适用于简单和复杂的信号图。 快速开始 水平翻转视频: import ffmpeg stream = ffmpeg.inputinput('input.mp4') st.

jacob210的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ffmpeg mediacodec 硬解初探

ffmpeg mediacodec 硬解初探 1编译: ffmpeg自3.1版本加入了android mediacodec硬解支持,解码器如图 硬件加速器如图(还不清楚硬件加速器的功能) 编译带h264_mediacodec版本的库需要开启以下选项 --enable-jni --enable-mediacodec --enable-decoder=h264_mediacod

欢迎关注我 https://x.com/Awesome_AI_News 8283

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: IC提供商列表
下一篇: FFMPEG(二)关键数据结构
makeyourprogress
博客等级 码龄11年 26粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值