首页 > 其他分享 >Lazarus使用FFMpeg解码视频文件

Lazarus使用FFMpeg解码视频文件

时间:2024-05-16 21:07:43浏览次数:18  
标签:FFMpeg frame ctx ret Lazarus packet av 视频文件 fmt

一、下载ffmpeg-delphi-pascal-headers

下载地址Headers | FFVCL – Delphi FFmpeg VCL Components(Video Encoder and Video Player)

下载 Releases · BtbN/FFmpeg-Builds · GitHub 下载与上面版本对应的DLL库

二、引用单元

libavformat,libavcodec_codec,libavcodec,FFUtils,libavutil,
libavcodec_packet,libavutil_frame,libavutil_error,libswscale,libavutil_pixfmt,libavutil_imgutils

三、解码

//实现解码一帧

procedure TForm1.Button1Click(Sender: TObject);
var
fmt_ctx: PAVFormatContext;
avdec: PAVCodec;
ret: Integer;
video_stream_index: Integer = -1;
dec_ctx: PAVCodecContext;
packet: PAVPacket;
frame: PAVFrame;
label
the_end;
label
Over_ok;
begin
//打开文件
filename:='E:/FdogXvid.avi';
fmt_ctx:=avformat_alloc_context;
ret := avformat_open_input(@fmt_ctx, PAnsiChar(AnsiString(filename)), nil, nil);
ret := avformat_find_stream_info(fmt_ctx, nil);
ret := av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, @avdec, 0);
video_stream_index:=ret;
dec_ctx := avcodec_alloc_context3(avdec);
avcodec_parameters_to_context(dec_ctx, PPtrIdx(fmt_ctx^.streams, video_stream_index)^.codecpar);

ret := avcodec_open2(dec_ctx, avdec, nil);
//解码一帧
frame := av_frame_alloc();
filt_frame := av_frame_alloc();
packet := av_packet_alloc();
while True do
begin
ret := av_read_frame(fmt_ctx, packet);
if ret < 0 then
Break;
if packet^.stream_index = video_stream_index then
begin
ret := avcodec_send_packet(dec_ctx, packet);
if ret < 0 then
Break;
ret := avcodec_receive_frame(dec_ctx, frame);
if (ret = AVERROR_EAGAIN) or (ret = AVERROR_EOF) then
Break
else if ret < 0 then
begin
goto the_end;
end;
{接收一帧完成,如何要多帧这里直接处理 不要跳转到Over_ok}

goto Over_ok;
end;
end;

Over_ok:
//显示图片 图片信息在frame^.data[0-2]中

the_end:
avcodec_free_context(@dec_ctx);
avformat_close_input(@fmt_ctx);
av_frame_free(@frame);
av_frame_free(@filt_frame);
av_packet_free(@packet);

end;

注意frame^.data中分别是YUV数据,不能直接被Timage使用。还没找到如何转换,现在是把data[0]中的数据放到Tbitmap的rgb中,显示是黑白的。

比如

for i:=0 to frame^.width*frame^.height-1 to

begin

(Bitmap.RawImage.Data+i*3)^:=frame^data[0][i];

(Bitmap.RawImage.Data+i*3+1)^:=frame^data[0][i];

(Bitmap.RawImage.Data+i*3+2)^:=frame^data[0][i];

end;

 

标签:FFMpeg,frame,ctx,ret,Lazarus,packet,av,视频文件,fmt
From: https://www.cnblogs.com/jwjss/p/18196736

相关文章

  • FFmpeg 命令:从入门到精通 | ffmpeg 命令图片和视频转换
    FFmpeg命令:从入门到精通|ffmpeg命令图片和视频转换截取一张图片转换视频为图片(每帧一张图)图片转换为视频从视频中生成GIF图片将GIF转化为视频FFmpeg命令:从入门到精通|ffmpeg命令图片和视频转换本节主要介绍了ffmpeg命令图片和视频转换的方法,并列举了一些例......
  • 【最新】windows电脑FFmpeg安装教程手把手详解
    【最新】windows电脑FFmpeg安装教程手把手详解写在最前一、下载&解压二、配置环境变量1、配置系统环境变量三、验证写在最前FFmpeg是一个免费的开源程序库,一个命令行工具软件,专门用来编辑处理各种音视频或图像。本文以WINDOW64位操作系统为例演示。一、下载&解压打开FFm......
  • FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
    ​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制订工作,参考软件的测试表明,AVS3基准档次的性能比上一代标准AVS2和HEVC提升了约30%。libuavs3d是AVS......
  • FFMpeg
    FFMpeg的官网下载转码程序点击Dowload 选择对应系统的下载源本次为Windows系统  选择Full标记的压缩包 解压压缩包,文件目录结构如下配置系统环境变量值Path,增减变量值 运行cmd查看安装结果ffmpeg-version3我讹误 ......
  • FFMpegCore 对音视频格式转换
    下载Nuget包FFMpegCore FFMpeg的官网下载转码程序点击Dowload 选择对应系统的下载源本次为Windows系统 选择Full标记的压缩包 解压后的文件结构ffmpeg版本 将bin文件夹下的ffmpeg.exe文件放置在程序项目的根目录下  视频格式转换以下是将.mov转.mp4///......
  • python-利用ffmpeg快速提取视频的音频文件
    """利用ffmpeg快速提取视频的音频文件"""#参考"https://www.cnblogs.com/CodeAndMoe/p/13360011.htmlwindow安装ffmpeg并且设置环境变量https://zhuanlan.zhihu.com/p/118362010"importosdefmain(v_path):#v_path表示视频所在路径生成后的MP3音频文件会在该视频文件目录中......
  • C# 使用ffmpeg读取监控视频流
    编译环境VisualStudio2022.NetFramework4.7.2x64需要开启允许不安全代码(项目属性->生成->允许不安全代码)之前使用OpenCVSharp写的一个拉流,在服务器上跑不起来。于是换了这个使用FFmpeg.AutoGen的。参考博文:用C#做一个拉流播放器-摇光Summer-博客园(cnblogs.com)......
  • windows安装ffmpeg
    官网https://ffmpeg.org/download.html这个是别人已经编译好的,不染源码还需要重新编译解压到一个目录,添加到环境变量......
  • FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
    ​同步播放音视频的时候,《FFmpeg开发实战:从零基础到短视频上线》一书第10章的示例程序playsync.c采取一边遍历一边播放的方式,在源文件的音频流和视频流交错读取的情况下,该方式可以很好地实现同步播放功能。但个别格式的音频流和视频流是分开存储的,前面一大段放了所有的音频帧,后......
  • FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
    ​FFmpeg结合SDL可以播放音频文件,也能播放视频文件中的音频流,《FFmpeg开发实战:从零基础到短视频上线》一书第10章的示例程序playaudio.c支持播放mp3和aac两种格式的音频,却不支持播放其他格式的音频。因为mp3和aac两个格式拥有标准的规范定义,比如mp3规定每帧音频固定包含1152个样......