ffmpeg的學習-00

  1. 命令行 大體樣式
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

有道翻譯的 以后仔細回看
2.描述
ffmpeg是一個非常快的視頻和音頻轉換器,也可以從一個實時音頻/視頻源抓取。它還可以轉換之間的任意采樣率和調整大小的視頻在飛行與高品質多相濾波器。
ffmpeg讀取由-i選項指定的任意數量的輸入“文件”(可以是常規文件、管道、網絡流、抓取設備等),并寫入由普通輸出url指定的任意數量的輸出“文件”。在命令行中發現的任何不能解釋為選項的內容都被認為是輸出url。
原則上,每個輸入或輸出url可以包含任意數量的不同類型的流(視頻/音頻/字幕/附件/數據)。允許的流的數量和/或類型可能受到容器格式的限制。選擇哪個輸入流將自動進入哪個輸出流,或者使用-map選項(請參閱流選擇章節)。
要引用選項中的輸入文件,必須使用它們的索引(基于0)。例如,第一個輸入文件是0,第二個是1,等等。類似地,文件中的流也由它們的索引引用。2:3是指第三個輸入文件中的第四個流。還請參閱流說明符一章。
通常,選項應用于下一個指定的文件。因此,順序很重要,您可以在命令行上多次使用相同的選項。然后,將每個事件應用到下一個輸入或輸出文件。這個規則的例外是全局選項(例如冗長級別),應該首先指定它。
不要混合輸入和輸出文件-首先指定所有輸入文件,然后指定所有輸出文件。也不要混合屬于不同文件的選項。所有選項只適用于下一個輸入或輸出文件,并在文件之間重置。
To set the video bitrate of the output file to 64 kbit/s:
將輸出文件的視頻比特率設置為64 kbit/s:

ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

To force the frame rate of the output file to 24 fps:
強制輸出文件幀率為24幀/秒:

ffmpeg -i input.avi -r 24 output.avi

To force the frame rate of the input file (valid for raw formats only) to 1 fps and the frame rate of the output file to 24 fps:
強制輸入文件的幀速率(只適用于原始格式)為1幀,輸出文件的幀速率為24幀:

ffmpeg -r 1 -i input.m2v -r 24 output.avi

???只適用于原始格式 不理解???
對于原始輸入文件,可能需要format選項。
3.詳細描述
ffmpeg中每個輸出的轉碼過程如下圖所示:

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+
|_______|            |______________|      |v_________|         || decoded || frames  ||_________|________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+
| file   |   muxer   | packets      |   encoder
|________|           |______________|

???decoded frames 這里不明白???

ffmpeg調用libavformat庫(包含demuxers)來讀取輸入文件并從其中獲取包含編碼數據的包。當有多個輸入文件時,ffmpeg試圖通過跟蹤任何活動輸入流上的最低時間戳來保持它們的同步。
???最低時間戳 什么概念 是不是最后的????
然后將經過編碼的包傳遞給解碼器(除非為流選擇streamcopy,否則請參閱進一步的描述)。解碼器產生未壓縮的幀(原始視頻/PCM音頻/…),可以通過過濾進一步處理(參見下一節)。過濾后,幀被傳遞給編碼器,編碼器對幀進行編碼并輸出編碼后的數據包。最后,它們被傳遞給muxer, muxer將經過編碼的包寫入輸出文件。
3.1過濾
在編碼之前,ffmpeg可以使用libavfilter庫中的過濾器處理原始音頻和視頻幀。幾個鏈接過濾器形成一個過濾器圖。ffmpeg區分了兩種過濾圖:簡單過濾圖和復雜過濾圖。
3.1.1 簡單過濾器圖
簡單的過濾器圖是那些只有一個輸入和輸出的過濾器,它們都屬于同一類型。在上圖中,只要在解碼和編碼之間插入一個額外的步驟,就可以表示為:

|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|\   __________   /simple     _\||          | /  encoderfiltergraph   | filtered |/| frames   ||__________|

簡單的過濾器圖配置為每流過濾器選項per-stream -filter option (分別為視頻和音頻配置-vf和-af別名)。一個簡單的視頻過濾圖可以像這樣:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

注意,有些過濾器改變幀屬性,但不改變幀內容。例如,上面例子中的fps過濾器會改變幀數,但不會觸及幀內容。另一個例子是setpts過濾器,它只設置時間戳,并以其他方式不變地傳遞幀。
3.1.2 復雜過濾器圖
復雜的過濾圖不能簡單地描述為應用于一個流的線性處理鏈。例如,當圖形有多個輸入和/或輸出時,或者當輸出流類型與輸入不同時,就會出現這種情況。它們可以用下圖表示:

 _________
|         |
| input 0 |\                    __________
|_________| \                  |          |\   _________    /| output 0 |\ |         |  / |__________|_________     \| complex | /
|         |     |         |/
| input 1 |---->| filter  |\
|_________|     |         | \   __________/| graph   |  \ |          |/ |         |   \| output 1 |_________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

復雜過濾器圖配置為-filter_complex選項。注意,這個選項是全局的,因為復雜的過濾器圖本質上不能與單個流或文件明確關聯。
-lavfi選項相當于-filter_complex。
復雜過濾圖的一個簡單示例是overlay filter,它有兩個視頻輸入和一個視頻輸出,其中一個視頻覆蓋在另一個之上。它的音頻對應項是amix過濾器。
3.2 Stream copy
流復制是通過向-codec選項提供復制參數來選擇的模式。它使ffmpeg省略了指定流的解碼和編碼步驟,因此它只進行解復用和muxing。它對于更改容器格式或修改容器級元數據非常有用。在這種情況下,上面的圖表將簡化為:

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

由于沒有解碼或編碼,它是非常快的,沒有質量損失。然而,由于許多因素,它可能在某些情況下不起作用。應用過濾器顯然也是不可能的,因為過濾器處理未壓縮的數據。
4. Stream selection
ffmpeg為手動控制每個輸出文件中的流選擇提供了-map選項。用戶可以跳過映射,并讓ffmpeg執行如下所述的自動流選擇。可以使用-vn / -an / -sn / -dn選項分別跳過視頻、音頻、字幕和數據流的包含,無論是手動映射還是自動選擇,但那些流是復雜過濾圖的輸出。
4.1 描述
下面的子部分描述了在流選擇中涉及的各種規則。下面的示例將展示如何在實踐中應用這些規則。
雖然已經盡了一切努力來準確地反映程序的行為,但是FFmpeg還在不斷地開發中,而且代碼可能在編寫本文時就已經更改了。
4.1.1 Automatic stream selection
在沒有特定輸出文件的任何映射選項的情況下,ffmpeg檢查輸出格式,以檢查可以包含哪種類型的流,即視頻、音頻和/或字幕。對于每個可接受的流類型,ffmpeg將在所有輸入中選擇一個可用的流。
它將根據以下標準選擇該流:
對于視頻,它是分辨率最高的流,
對于音頻,它是擁有最多頻道的流,
對于字幕,這是第一個字幕流,但有一個警告。輸出格式的默認字幕編碼器可以是基于文本的,也可以是基于圖像的,并且只選擇相同類型的字幕流。
在相同類型速率的多個流相同的情況下,選擇索引最低的流。
數據或附件流不會自動選擇,只能使用-map包含。
4.1.2 Manual stream selection
當使用-map時,該輸出文件中只包含用戶映射的流,下面描述的filtergraph輸出可能有一個例外。
4.1.3 Complex filtergraphs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Linux]消息隊列

我們知道進程間通信的方法有多種&#xff0c;主要有管道&#xff0c;消息隊列&#xff0c;信號量&#xff0c;共享內存&#xff0c;socket等。之前介紹過管道&#xff0c;今天再介紹一個新的概念–消息隊列。 消息隊列&#xff1a;將一個進程到另一個進程之間發送數據塊的方式…

詳解centos7 YCM YouCompleteMe自動補全安裝,親測成功

文章經重新排版轉移至以下鏈接 https://blog.csdn.net/csdn_kou/article/details/84633663

python 異步與io

文檔地址&#xff1a; https://docs.python.org/zh-cn/3/library/asyncio.html 以后再記錄學習筆記 待續。。。

tornado 學習注意事項--00

設置url匹配的時候&#xff0c; (r/(.*), AMStaticFileHandler,dict(pathos.path.join(current_path, html), default_filenameindex.html))像這種語句要放到最后&#xff0c;因為放到前面的話&#xff0c; 后面的就無法匹配&#xff01;

C++關鍵字速查手冊

[TOC] https://blog.csdn.net/csdn_kou/article/details/81113215 C98關鍵字 C11 關鍵字共73個 alignas alignof用于獲取取指定表達式指定的&#xff08;類似sizeof&#xff0c;可以直接是類型名&#xff09;的對齊(alignment)。alignas用于聲明時指定對齊類似于現有的類型…

[Linux]信號

Linux下的信號是一個什么概念呢。我們在現實生活中也遇到過信號之類的。比如紅綠信號燈&#xff0c;班主任叫你去辦公室并且臉色不好&#xff0c;諸如此類的都會給你一個信號。讓你辨別事情的發生。同樣&#xff0c;Linux下也有許多的信號&#xff0c;讓你執行相應的操作。比如…

怎么用VLC播放器將m3u8鏈接視頻下載到本地

轉載 https://blog.csdn.net/saddyyun/article/details/85245135

【1】C++面試題函數引用重載宏命名空間

函數重載的條件 ? 同一個名字 ? 函數名字相同 ? 參數列表不同 ? 同一個作用域 為什么c支持函數重載而c不支持&#xff1f; c函數名字的修飾規則不一樣。c編譯器對函數修飾規則把int的參數列表形式加了進來&#xff0c;從而保證底層使用不同 cAdd(int a,int b)_AddcA…

[數據結構]Map和Set

說起map和set&#xff0c;想必我們都學過紅黑樹了吧&#xff0c;map和set就是紅黑樹的一個應用領域。它的底層就是由紅黑樹來實現的。下面簡單說一下map和set的使用吧。 首先&#xff0c;有一個栗子是這樣的&#xff0c;讓我們統計出每種水果出現的次數。 我們會想到怎么解決…

js獲取Json對象的長度

有兩種Json形式&#xff1a; 第一種&#xff1a; var json1 {"data":[{"name":"zs","age":"10"}]};對于這種格式的json數據&#xff0c;如果想獲取data的長度&#xff0c;就可以用以下這種方式&#xff1a; var length …

生產者消費者模型(條件變量)

三種關系&#xff1a;互斥&#xff0c;同步&#xff0c;互斥和同步 兩類角色:生產者&#xff0c;消費者&#xff08;線程&#xff09; 一個交易場所&#xff1a;生產者消費者共享的區域 賣蘋果的模型 dish上面只有一個蘋果買家必須要等賣家把蘋果放到dish上才可以去買蘋果。…

linux之信號

信號&#xff1a;在生活中&#xff0c;我們遇到過不同種類的信號&#xff0c;比如&#xff1a;&#xff08;交通信號&#xff0c;乃至某個人的表情&#xff0c;動作等帶給你不同的信號&#xff09;然而&#xff0c;在我們的linux下&#xff0c;我們最熟悉的就是&#xff0c;當遇…

視頻解析有感,在解析 iqiyi與qq視頻的時候,記錄一些發現

最近對iqiyi與qq視頻解析發現&#xff0c;兩個網站的解析流程&#xff0c;尤其是反解析措施 各有特點&#xff0c;簡單記錄一下 先說iqiyi&#xff0c; 瀏覽器模擬移動端可以拿到視頻的mp4鏈接&#xff0c;這個不多說。 iqiyiPC端瀏覽器獲取 ts過程&#xff1a; a.iqiyi一次性…

C語言atoi函數的用法

#include < stdlib.h > int atoi(const char *nptr);用法&#xff1a;將字符串里的數字字符轉化為整形數。返回整形值。 注意&#xff1a;轉化時跳過前面的空格字符&#xff0c;直到遇上數字或正負符號才開始做轉換&#xff0c;而再遇到非數字或字符串結束時(’/0’)才…

[Linux]繼續探究mysleep函數(競態條件)

之前我們探究過mysleep的簡單用法&#xff0c;我們實現的代碼是這樣的&#xff1a; #include<stdio.h> #include<signal.h>void myhandler(int sig) {}unsigned int mysleep(unsigned int timeout) {struct sigaction act,oact;act.sa_handler myhandler;sigempt…

C語言的atoi和C++的to_string

to_stringint to string將其他型轉換成字符串型atoiascii to integer是把字符串轉換成整型數的一個函數 to_string #include <iostream> // std::cout #include <string> // std::string, std::to_stringint main () {std::string perfect std::to_string…

ubuntu 升級python3.5到python3.7,并升級pip3

1, 下載python3.7.tgz 文件&#xff0c;解壓&#xff0c; 2. 編譯安裝 3. 刪除 /usr/bin 目錄下的 pip3, python3 4. 建立新的軟連接&#xff1a; #添加python3的軟鏈接ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3#添加 pip3 的軟鏈接ln -s /usr/local/python3/b…

[Linux]死鎖

死鎖是指多個進程在運行過程中因爭奪資源而造成的一種僵局&#xff0c;當進程處于這種僵持狀態時&#xff0c;若無外力作用&#xff0c;它們都將無法再向前推進。之前信號量的時候我們知道&#xff0c;如果多個進程等待&#xff0c;主要體現在占有鎖的問題上。死鎖也可以被定義…

Python安裝第三方模塊總結 轉載的

轉自 https://www.jellythink.com/archives/541

[C++]vector創建二維數組

c.resize(n);將c重置為大小為n個元素向量&#xff0c;如果n比原來的元素多&#xff0c;則多出的元素常被初始化為0//節選《面向對象的程序設計》杜茂青 int N5, M6; vector<vector<int> > Matrix(N); for(int i 0; i< Matrix.size(); i){ Matrix[i].resize(M…