利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

这篇具有很好参考价值的文章主要介绍了利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、FFmpeg简介。

二、FFmpeg常用参数及命令。

三、FFmpeg在Unity 3D中的使用。
  1、FFmpeg 录屏。
  2、FFmpeg 推流。
  3、FFmpeg 其他功能简述。

一、FFmpeg简介

对于FFmpeg,其官网上是这样介绍的:
FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.
FFmpeg能够实现对视频音频编码、解码、转码、流传输等等一系列功能。它包含有libavcodec, libavutil, libavformat, libavfilter, libavdevice, libswscale,libswresample 库。其中:

libavcodec      是一个包含用于音频/视频编解码器的解码器和编码器的库。
libavutil       是一个包含简化编程功能的库,包括随机数生成器,数据结构,数学例程,核心多媒体实用程序等等。
libavformat     是一个包含多媒体容器格式的解复用器和复用器的库。
libavdevice     是一个包含输入和输出设备的库,用于从许多常见的多媒体输入/输出软件框架中获取和呈现,包括Video4Linux,Video4Linux2,VfW和ALSA。
libavfilter     是一个包含媒体过滤器的库。
libswscale      是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。
libswresample   是一个执行高度优化的音频重采样,重新矩阵化和样本格式转换操作的库。

二、FFmpeg常用参数及命令

1、命令的格式:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

2、常用参数:

-f fmt (input/output)   强制设定输入或输出文件格式。通常会自动检测输入文件的格式,并从输出文件的文件扩展名猜测格式,因此大多数情况下不需要这个选项。
-i url (input)          输入
-y (global)             在没有请求的情况下覆盖输出文件。
-n (global)             不要覆盖输出文件,如果指定的输出文件已经存在,则会立即退出。
-stream_loop number     设定输入流循环的次数。循环0表示没有循环,循环1表示无限循环
-codec/-c               设置编码格式
-r fps                  设置帧速率
-vcodec codec (output)  设置视频编码格式,同-codec:v
-pix_fmt format         设置像素格式
-ar freq                设置音频采样频率
-aq q (output)          设置音频质量
-acodec codec           设置音频编解码器,同-codec:a

3、常用命令

(1)将视频的帧速率改为24
ffmpeg -i input.avi -r 24 output.avi

(2)视频格式转换,将avi转成mp4
ffmpeg -i input.avi output.mp4

(3)从视频中提取音频
ffmpeg -i test.mp4 -acodec libmp3lame output.mp3

(4)视频剪切
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4

(5)视频添加Logo
ffmpeg -i input.mp4 -i Logo.png -filter_complex overlay output.mp4

(6)视频去掉Logo
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4

(7)将100张图片合成视频,并为其添加背景音频(注意:图片要放在同一个文件夹下,并将图片按001--100的格式命名)
ffmpeg -i 001.mp3 -i %3d.jpg -s 1024x768 -author fy -vcodec mpeg4 darkdoor.avi

(8)将视频每隔一秒抽取一张图片,保存名字为 foo-001.jpeg, foo-002.jpeg, 等
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

 三、FFmpeg在Unity 3D中的使用

有网友问我如何在Unity中使用FFmpeg呢,趁今天老大出差了,忙里偷闲更新一下博客。
使用FFmpeg首先得有FFmpeg,可以直接从官网免费下载,也可以从Unity Store花费85美元下载插件FFmpeg Unity Bind,
如果你有插件FFmpeg Unity Bind,那你就不用再往下看了,因为本文使用的就是FFmpeg Unity Bind的思想:用命令行参数实现FFmpeg的调用。

1、命令行调用FFmpeg的核心代码如下:

     public static void Execute(string command)
        {
            if (isRunning)
                return;

            //Clear output buffer
            buffer = new StringBuilder(short.MaxValue);

            new Thread(() =>
            {
                isRunning = true;
                Thread.CurrentThread.IsBackground = true;

                //Execute binary
                p = new Process();
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.FileName = binaryPath;
                p.StartInfo.Arguments = command;


                p.StartInfo.RedirectStandardInput = true;//这句一定需要,用于模拟该进程控制台的输入

                p.OutputDataReceived += (s, e) =>
                {
                    callback(FFmpegParser.COMMAND_CODE + FFmpegParser.PROGRESS_CODE + AppendLog(e.Data));
                };
                p.ErrorDataReceived += (s, e) =>
                {

                    if (!string.IsNullOrEmpty(e.Data) && e.Data.ToLower().Contains("error"))
                        callback(FFmpegParser.ERROR_CODE + AppendLog(e.Data));
                    else
                        callback(FFmpegParser.COMMAND_CODE + FFmpegParser.PROGRESS_CODE + AppendLog(e.Data));
                };

                p.Start();

                callback(FFmpegParser.COMMAND_CODE + FFmpegParser.START_CODE + "\nStarted\n");

                p.BeginOutputReadLine();
                p.BeginErrorReadLine();

                p.WaitForExit();

                if (isStopProcessWhatIthink)
                {
                    callback(FFmpegParser.COMMAND_CODE + FFmpegParser.SUCCESS_CODE + AppendLog("主动关闭 FFmpeg 进程") );
                    isStopProcessWhatIthink = false;
                }
                else
                {
                    callback(FFmpegParser.COMMAND_CODE +
                             (p.ExitCode == 0 ?
                              FFmpegParser.SUCCESS_CODE + AppendLog("Success!") :
                              FFmpegParser.FAILURE_CODE + AppendLog("Failure. Search details above")));
                    p.Close();
                }
                callback(FFmpegParser.COMMAND_CODE + FFmpegParser.FINISH_CODE + "\nFinished\n");
                isRunning = false;
            }).Start();
        }

        /// 

        /// 主动退出进程
        /// 

        public static void CloseFFmpegProcess()
        {
            if (p!=null)
            {
                try
                {

                    p.StandardInput.WriteLine("q");//在这个进程的控制台中模拟输入q,用于暂停录制
                    p.Close();
                    p.Dispose();

                    isRunning = false;


                    isStopProcessWhatIthink = true;
                    p = null;
                    UnityEngine.Debug.Log("主动退出FFmpeg进程");
                }
                catch (Exception)
                {
                    UnityEngine.Debug.Log("No process to kill");
                }

            }
            else
            {
                UnityEngine.Debug.Log("FFmpeg process is null");

            }
        }

2、FFmpeg 录屏、推流常用命令

//推流命令
//-re -i C:\output.mp4  -vcodec libx264 -acodec copy  -f flv -y rtmp://***/live/chid
//拉流
//-i rtmp://127.0.0.1/live/chid -acodec copy -vcodec copy -f flv -y chid.mp4
//-i rtmp://127.0.0.1/live/chid -c copy dump.flv
 
// rtsp 推流
// -i C:\output.mp4  -vcodec libx264 -f rtsp rtsp://***/myid
//-f gdigrab -i desktop -vcodec libx264 -preset ultrafast -acodec libmp3lame -ar 44100 -ac 1 -f rtsp rtsp://***/myid
//推 摄像头
//-f dshow -i video="HD Pro Webcam C920" -vcodec libx264 -acodec copy -preset:v ultrafast -tune:v zerolatency -f rtsp rtsp://***/myid
//音视频录制
//-f dshow -video_size 1680x1050 -framerate 30 -pixel_format yuv420p -i audio="麦克风 (HD Pro Webcam C920)" av-out.mp4

        //-f fmt    指定格式(音视频的格式)
//dshow
//-i        输入
//-vcodec   强制使用codec编解码方式(\'copy\' to copy stream)
//libx264  
//-acodec   指定音频编码(\'copy\' to copy stream)
//copy     
//-preset  
//-tune    
//-y        覆盖已有文件
//-c       
 
//传输的图像为灰色的解决办法,添加:-pix_fmt yuv420p
//录制桌面:desktop
//录制窗口:title=窗口名
// av_interleaved_write_frame(): Broken pipe 问题:在-f rtsp后面加一个-rtsp_transport tcp
 
//录制整个程序窗口
//string command = "-f gdigrab -i title=test -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -acodec libmp3lame -ar 44100 -ac 1 -f rtsp -rtsp_transport tcp rtsp://***/myid";
 
//录制某一区域(这里是摄像头区域)
//-offset_x 10 -offset_y 20 -video_size 640x480 从屏幕的(10,20)点处开始,抓取640x480的屏幕
//-s 640x480   指定分辨率 (640x480)
//-r 60 设置帧率 (和程序的fps保持一致,解决Past duration 0.692253 too large的问题)
//string command = "-f gdigrab -offset_x 920 -offset_y 85 -video_size 320*240 -s 320*240 -i title=test -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -r 60 -acodec libmp3lame -ar 44100 -ac 1 -f rtsp -rtsp_transport tcp rtsp://***/myid";
//string command = "-f gdigrab -offset_x 920 -offset_y 85 -video_size 320*240 -s 320*240 -i title=test -f dshow -i audio=\""+ micName + "\" -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -r 60 -acodec aac -ar 16000 -ac 1 -f rtsp -rtsp_transport tcp rtsp://***/myid";
 
//输入交换视频和音频的位置,画面不卡顿了
//string command = "-f dshow -i audio=\"" + micName + "\" -f gdigrab -offset_x 920 -offset_y 85 -video_size 320*240 -s 320*240 -i title=test -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -f rtsp -rtsp_transport tcp "+ ClientController.rtspId;
//FFmpegCommands.DirectInput(command);
 
//-re(输入)主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽快读取输入。此选项将减慢输入读取到输入的本机帧速率。它对于实时输出(例如直播)非常有用。
//string command = "-re -i \"" + path + "\" -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -f rtsp -rtsp_transport tcp " +ClientController.rtspId;文章来源地址https://www.toymoban.com/news/detail-488018.html

到了这里,关于利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt+ffmpeg 实现音视频播放(二)之音频播放

    通过  avformat_open_input () 打开媒体文件并分配和初始化  AVFormatContext   结构体。 函数原型如下: int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说明: - `ps`:指向 `AVFormatContext` 结构体指针的指针,用于存储打开的媒体文件的信息。

    2024年04月22日
    浏览(33)
  • OpenAI Whisper + FFmpeg + TTS:动态实现跨语言视频音频翻译

    本文作者系360奇舞团前端开发工程师 本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS(Text-to-Speech)技术,以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译,然后使用 FFmpeg 提取视频音轨和处理视频,最后使用 TTS 技术生成新

    2024年02月09日
    浏览(37)
  • 利用第三方解码器ffmpeg让群晖DSM6.2.4版本的Video Station支持DTS视频编码和EAC3音频编码

    截至2022年5月6日,此方法可用! 本文章可以解决群晖版本6.2.4-25556 Update5(Video Station版本2.5.0-1656)在播放dts、eac3音频编码的视频时提示不支持的问题。 对于群晖6.2.3版本,Video Station版本2.4.9,网上随便搜的方法都可以使用,但是用在6.2.4未必可行。原因在于Video Station版本2

    2023年04月08日
    浏览(28)
  • 音视频开发系列(10):基于qt的音频推流

    今天分享一下利用qt录制音频,然后再利用ffmpeg推流到nginx服务器,最后再利用vlc进行拉流的demo。 首先介绍一下如何利用qt来进行音频的录制,qt的音频录制主要利用qt的QAudioFormat先进行音频信息的配置。主要需要配置以下的信息: 然后使用QAudioDeviceInfo来获取是否支持改设置

    2024年02月02日
    浏览(39)
  • Vue 3 + ffmpeg + wasm 实现前端视频剪辑、音频剪辑、音波展示、视频抽帧、gif抽帧、帧播放器、字幕、贴图、时间轴、素材轨道

    预览 www.bilibili.com/video/BV1YT411Y7YJ 技术栈: 💪 Vue 3、Vue-Router 4、Vite、pnpm、esbuild、TypeScript ☀️ Pinia 状态管理 🌪 Tailwind 原子css集成 💥 ffmpeg、wasm 底层音视频处理集成 功能 多轨道时间轴,支持帧缩放,时间缩放 支持多种类型轨道的添加删除 多功能轨道调节,支持音视频轨

    2024年02月11日
    浏览(32)
  • ffmpeg视频音频命令

    视频音频合并,以视频时间为主,音频短了循环 方法1:混音,视频权重0,volume调节音量,aloop无限循环,duration:first为第一个素材的长度 ffmpeg -i video.mp4 -i audio.mp3 -filter_complex \\\"[1:a]volume=0.5[a1];[a1]aloop=loop=-1:size=2e+09[a2];[0:a][a2]amix=inputs=2:duration=first:weights=\\\'0 1\\\'[a]\\\" -map 0:v -map \\\"[a]\\\"

    2024年02月13日
    浏览(23)
  • FFmpeg从视频中提取音频

    参考博客 ffmpeg Documentation FFmpeg最全教程 FFmpeg 提取视频的音频 FFMPEG 提取音频 ffmpeg 给音频添加封面,ffmpeg对音视频metadata相关操作 查看 使用 FFprobe ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的

    2023年04月08日
    浏览(38)
  • 【FFmpeg】音视频录制 ① ( 查询系统中 ffmpeg 可录制的音视频输入设备 | 使用 ffmpeg 命令录制音视频数据 | 录制视频数据命令 |录制音频数据| 同时录制音频和视频数据命令 )

    在 Windows 系统中 , 使用 ffmpeg 命令 录制 音视频 , 需要先获取 系统的 音视频设备 信息 , 录制 音视频 本质上是从 系统音视频设备 中获取数据 ; 执行 命令 , 可以获取 系统中 ffmpeg 可用的 DirectShow 音视频输入设备 ; 命令参数解析 : -list_devices true : 列出所有 ffmpeg 的 指定类型的可

    2024年04月25日
    浏览(67)
  • OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)

    windows平台笔记本摄像头视频采集、人脸识别,识别后将视频推流到RTMP流媒体服务器,在任意客户端可以进行RTMP拉流播放。 效果如图: 使用VLC播放器进行拉流。 需要先安装OpenCV的python包以及FFmpeg。 对于ffmpeg有两种调用方式,但这两种方式都需要先安装ffmpeg,调用的具体区别

    2024年02月12日
    浏览(30)
  • FFmpeg/opencv + C++ 实现直播拉流和直播推流(对视频帧进行处理)

    本文主要使用C++ ffmpeg库实现对除去webrtc的视频流进行拉流,而后经过自身的处理,而后通过将处理后的视频帧进行编码,最后进行推流处理。详情请看代码 参考链接: https://blog.csdn.net/weixin_45807901/article/details/129086344 https://blog.csdn.net/T__zxt/article/details/126827167

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包