一、FFmpeg簡(jiǎn)介。
二、FFmpeg常用參數(shù)及命令。
三、FFmpeg在Unity 3D中的使用。
1、FFmpeg 錄屏。
2、FFmpeg 推流。
3、FFmpeg 其他功能簡(jiǎn)述。
一、FFmpeg簡(jiǎn)介
對(duì)于FFmpeg,其官網(wǎng)上是這樣介紹的:
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能夠?qū)崿F(xiàn)對(duì)視頻音頻編碼、解碼、轉(zhuǎn)碼、流傳輸?shù)鹊纫幌盗泄δ?。它包含有l(wèi)ibavcodec, libavutil, libavformat, libavfilter, libavdevice, libswscale,libswresample 庫。其中:
libavcodec ? ? ?是一個(gè)包含用于音頻/視頻編解碼器的解碼器和編碼器的庫。
libavutil ? ? ? 是一個(gè)包含簡(jiǎn)化編程功能的庫,包括隨機(jī)數(shù)生成器,數(shù)據(jù)結(jié)構(gòu),數(shù)學(xué)例程,核心多媒體實(shí)用程序等等。
libavformat ? ? 是一個(gè)包含多媒體容器格式的解復(fù)用器和復(fù)用器的庫。
libavdevice ? ? 是一個(gè)包含輸入和輸出設(shè)備的庫,用于從許多常見的多媒體輸入/輸出軟件框架中獲取和呈現(xiàn),包括Video4Linux,Video4Linux2,VfW和ALSA。
libavfilter ? ? 是一個(gè)包含媒體過濾器的庫。
libswscale ? ? ?是一個(gè)執(zhí)行高度優(yōu)化的圖像縮放和色彩空間/像素格式轉(zhuǎn)換操作的庫。
libswresample ? 是一個(gè)執(zhí)行高度優(yōu)化的音頻重采樣,重新矩陣化和樣本格式轉(zhuǎn)換操作的庫。
二、FFmpeg常用參數(shù)及命令
1、命令的格式:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
2、常用參數(shù):
-f fmt (input/output) ? 強(qiáng)制設(shè)定輸入或輸出文件格式。通常會(huì)自動(dòng)檢測(cè)輸入文件的格式,并從輸出文件的文件擴(kuò)展名猜測(cè)格式,因此大多數(shù)情況下不需要這個(gè)選項(xiàng)。
-i url (input) ? ? ? ? ?輸入
-y (global) ? ? ? ? ? ? 在沒有請(qǐng)求的情況下覆蓋輸出文件。
-n (global) ? ? ? ? ? ? 不要覆蓋輸出文件,如果指定的輸出文件已經(jīng)存在,則會(huì)立即退出。
-stream_loop number ? ? 設(shè)定輸入流循環(huán)的次數(shù)。循環(huán)0表示沒有循環(huán),循環(huán)1表示無限循環(huán)
-codec/-c ? ? ? ? ? ? ? 設(shè)置編碼格式
-r fps ? ? ? ? ? ? ? ? ?設(shè)置幀速率
-vcodec codec (output) ?設(shè)置視頻編碼格式,同-codec:v
-pix_fmt format ? ? ? ? 設(shè)置像素格式
-ar freq ? ? ? ? ? ? ? ?設(shè)置音頻采樣頻率
-aq q (output) ? ? ? ? ?設(shè)置音頻質(zhì)量
-acodec codec ? ? ? ? ? 設(shè)置音頻編解碼器,同-codec:a
3、常用命令
(1)將視頻的幀速率改為24
ffmpeg -i input.avi -r 24 output.avi
(2)視頻格式轉(zhuǎn)換,將avi轉(zhuǎn)成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張圖片合成視頻,并為其添加背景音頻(注意:圖片要放在同一個(gè)文件夾下,并將圖片按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中的使用
有網(wǎng)友問我如何在Unity中使用FFmpeg呢,趁今天老大出差了,忙里偷閑更新一下博客。
使用FFmpeg首先得有FFmpeg,可以直接從官網(wǎng)免費(fèi)下載,也可以從Unity Store花費(fèi)85美元下載插件FFmpeg Unity Bind,
如果你有插件FFmpeg Unity Bind,那你就不用再往下看了,因?yàn)楸疚氖褂玫木褪荈Fmpeg Unity Bind的思想:用命令行參數(shù)實(shí)現(xiàn)FFmpeg的調(diào)用。
1、命令行調(diào)用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;//這句一定需要,用于模擬該進(jìn)程控制臺(tái)的輸入
? ? ? ? ? ? ? ? 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("主動(dòng)關(guān)閉 FFmpeg 進(jìn)程") );
? ? ? ? ? ? ? ? ? ? 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();
? ? ? ? }
? ? ? ? ///?
? ? ? ? /// 主動(dòng)退出進(jìn)程
? ? ? ? ///?
? ? ? ? public static void CloseFFmpegProcess()
? ? ? ? {
? ? ? ? ? ? if (p!=null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? p.StandardInput.WriteLine("q");//在這個(gè)進(jìn)程的控制臺(tái)中模擬輸入q,用于暫停錄制
? ? ? ? ? ? ? ? ? ? p.Close();
? ? ? ? ? ? ? ? ? ? p.Dispose();
? ? ? ? ? ? ? ? ? ? isRunning = false;
? ? ? ? ? ? ? ? ? ? isStopProcessWhatIthink = true;
? ? ? ? ? ? ? ? ? ? p = null;
? ? ? ? ? ? ? ? ? ? UnityEngine.Debug.Log("主動(dòng)退出FFmpeg進(jìn)程");
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? 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="麥克風(fēng) (HD Pro Webcam C920)" av-out.mp4文章來源:http://www.zghlxwxcb.cn/news/detail-488018.html
? ? ? ? //-f fmt ? ?指定格式(音視頻的格式)
//dshow
//-i ? ? ? ?輸入
//-vcodec ? 強(qiáng)制使用codec編解碼方式(\'copy\' to copy stream)
//libx264 ?
//-acodec ? 指定音頻編碼(\'copy\' to copy stream)
//copy ? ??
//-preset ?
//-tune ? ?
//-y ? ? ? ?覆蓋已有文件
//-c ? ? ??
?
//傳輸?shù)膱D像為灰色的解決辦法,添加:-pix_fmt yuv420p
//錄制桌面:desktop
//錄制窗口:title=窗口名
// av_interleaved_write_frame(): Broken pipe 問題:在-f rtsp后面加一個(gè)-rtsp_transport tcp
?
//錄制整個(gè)程序窗口
//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";
?
//錄制某一區(qū)域(這里是攝像頭區(qū)域)
//-offset_x 10 -offset_y 20 -video_size 640x480 從屏幕的(10,20)點(diǎn)處開始,抓取640x480的屏幕
//-s 640x480 ? 指定分辨率 (640x480)
//-r 60 設(shè)置幀率 (和程序的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(輸入)主要用于模擬抓取設(shè)備或?qū)崟r(shí)輸入流(例如,從文件讀取時(shí))。不應(yīng)與實(shí)際的抓取設(shè)備或?qū)崟r(shí)輸入流一起使用(它可能導(dǎo)致數(shù)據(jù)包丟失)。默認(rèn)情況下,ffmpeg嘗試盡快讀取輸入。此選項(xiàng)將減慢輸入讀取到輸入的本機(jī)幀速率。它對(duì)于實(shí)時(shí)輸出(例如直播)非常有用。
//string command = "-re -i \"" + path + "\" -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -f rtsp -rtsp_transport tcp " +ClientController.rtspId;文章來源地址http://www.zghlxwxcb.cn/news/detail-488018.html
到了這里,關(guān)于利用FFmpeg實(shí)現(xiàn)錄屏、直播推流、音頻視頻格式轉(zhuǎn)換、剪裁等功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!