FFmpeg 工具:音視頻開發都用它,快@你兄弟來看丨音視頻工具

vx 搜索『gjzkeyframe』 關注『關鍵幀Keyframe』來及時獲得最新的音視頻技術文章。

畢加索《燈》像素版

去公眾號發送消息『像素王國』,幫你生成像素風格圖片

(本文基本邏輯:ffmpeg 常用命令介紹 → ffplay 常用命令介紹 → ffprobe 常用命令介紹)

從事音視頻開發的程序員幾乎都應該知道或使用過 FFmpeg。FFmpeg 是一個開源軟件,采用 LGPL 或 GPL 許可證(需要注意這里的開源協議,它具有『傳染性』,會要求它的使用方也開源)。我們可以使用 FFmpeg 來進行多種格式音頻和視頻的錄制、轉換、流處理功能。

FFmpeg 由多個組件組成,包含了命令行應用程序以及一系列函數庫:

  • 命令行應用程序:

  • ffmpeg:用于音視頻的編解碼、格式轉換以及音視頻流的內容處理。

  • ffplay:基于 SDL 與 ffmpeg 庫實現的一個播放器。

  • ffprobe:音視頻分析工具。

  • 函數庫:

  • libavcodec:編解碼庫。

  • libavformat:音視頻容器格式以及所支持的協議的封裝和解析。

  • libavutil:提供了一些公共函數,工具庫。

  • libavfilter:音視頻的濾鏡庫,如視頻加水印、音頻變聲等。

  • libavdevice:支持眾多設備數據的輸入與輸出,如讀取攝像頭數據、屏幕錄制。

  • libswresample, libavresample:提供音頻的重采樣工具庫。

  • libswscale:提供對視頻圖像進行色彩轉換、縮放以及像素格式轉換,如圖像的 YUV 轉換。

  • libpostproc:多媒體后處理器。

如果你使用 Mac 設備,在 Mac 上安裝 FFmpeg 可以用 Homebrew

$ brew install ffmpeg

至于 Homebrew 的安裝,以及使用它安裝 ffmpeg 的相關細節,這里就不做過多探討了。

本文主要介紹 FFmpeg 命令行應用程序的使用,這是我們在音視頻開發中必不可少的工具。

1、ffmpeg 命令行工具

ffmpeg 是一個音視頻編解碼、格式轉換以及音視頻流內容處理的工具。

1.1、基礎能力

通過下列命令可以查看當前 ffmpeg 工具所支持的能力:

// 獲取幫助$ ffmpeg -help// 支持的格式$ ffmpeg -formats// 支持的解碼$ ffmpeg -decoders// 支持的編碼$ ffmpeg -encoders// 支持的協議$ ffmpeg -protocols

1.2、轉封裝

可以使用下列命令來轉封裝:

$ ffmpeg -i <輸入文件路徑> -c copy -f <輸出封裝格式> <輸入文件路徑>

1)轉 MP4

MP4 是當下短視頻最常使用的封裝格式,關于 MP4 格式更詳細的介紹,參見《MP4 格式》

FFmpeg 封裝 MP4 常用參數:

FFmpeg 封裝 MP4 常用參數

示例:將 FLV 的文件轉封裝成 MP4 并將 moov box 移動到文件頭部。

$ ffmpeg -i input.flv -c copy -f mp4 -movflags faststart output.mp4

2)轉 FLV

FLV 是當下實時直播最常使用的封裝格式,關于 FLV 格式更詳細的介紹,參見《FLV 格式》

FFmpeg 封裝 FLV 常用參數:


FFmpeg 封裝 FLV 常用參數

示例:將 MP4 的文件轉封裝成 FLV。

$ ffmpeg -i input.mp4 -c copy -f flv output.flv

FLV 封裝中可以支持的音頻編碼和視頻編碼是有限的,在轉封裝的時候,如果音頻或視頻不符合標準時,會封裝不了而報錯。一般,我們可以在轉封裝的時候同時將音頻和視頻轉碼成 FLV 支持的格式。

示例:將 MP4 的文件轉封裝成 FLV 并確保音頻轉碼為 AAC。

$ ffmpeg -i input.mp4 -vcodec copy -acodec aac -f flv output.flv

3)轉 HLS

HLS 是當下直播回放和部分實時直播場景最常使用的協議,它對應的媒體格式是 M3U8 + TS,關于 HLS 更詳細的介紹,參見《HLS 協議》《M3U8 格式》《TS 格式》

FFmpeg 封裝 HLS 常用參數:

FFmpeg 封裝 HLS 常用參數

示例:將 MP4 的文件轉封裝成 HLS 直播。

$ ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8

因為默認是 HLS 直播,所以生成的 M3U8 文件內容會隨著切片的產生而更新。這里多了一個 -bsf:v h264_mp4toannexb 參數,它的作用是將 MP4 中的 H.264 數據轉換為 H.264 AnnexB 標準的編碼,AnnexB 標準的編碼常見于實時傳輸流中。如果源文件為 FLV、TS 等可作為直播傳輸流的視頻,則不需要這個參數。

  • re:表示以本地幀率讀數據。
  • bsf:表示 Binary Stream Filter。

4)音視頻流抽取

FFmpeg 除了轉封裝、轉碼之外,還可以提取音頻流和視頻流。

示例:從 MP4 文件中提取 AAC 音頻流。

$ ffmpeg -i input.mp4 -vn -acodec copy output.aac
  • vn:表示不包含視頻。

示例:從 MP4 文件中提取 H.264 視頻流。

$ ffmpeg -i input.mp4 -an -vcodec copy output.h264
  • an:表示不包含音頻。

示例:從 MP4 文件中提取 H.265 視頻流。

$ ffmpeg -i input.mp4 -an -vcodec copy -bsf hevc_mp4toannexb -f hevc output.hevc

1.3、轉碼

FFmpeg 一般使用 libx264 來進行軟編碼。下面是 x264 相關的編碼參數:

FFmpeg x264編碼常用參數

1)Preset

示例:設置 preset 預設參數為 ultrafast 進行轉碼。

$ ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
  • b:v:表示視頻輸出碼率。

2)Profile

示例:設置 profile 為 high 進行轉碼。

$ ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 720x1280 -an -y -t 10 output_high.ts
  • y:表示覆蓋輸出文件。
  • s:表示輸出分辨率。

使用 main profile 和 high profile 編碼出來的視頻是可以包含 B 幀的,轉碼完后,可以看一下:

$ ffprobe -v quiet -show_frames -select_streams v output_high.ts | grep "pict_type=B" | wc -l

3)GOP

示例:設置 GOP 為 50 幀,并且場景切換時不插入關鍵幀。

$ ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 -y output.mp4
  • g:以幀為單位設置 GOP 大小。
  • sc_threshold:設定是否在場景切換時插入關鍵幀。0 表示不插入,1 表示插入。

4)B 幀

由于設置 x264 的參數比較多,所以 FFmpeg 開放了 x264opts 來設置 x264 內部的私有參數。

示例:設置 GOP 為 50 幀,并且場景切換時不插入關鍵幀,且不出現 B 幀。

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4

示例:設置 GOP 為 50 幀,并且場景切換時不插入關鍵幀,且 2 個 P 幀之間存放 3 個 B 幀。

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 -t 60 -y output.mp4

5)碼率

編碼時能夠設置 VBR、CBR 編碼模式,VBR 表示可變碼率,CBR 表示恒定碼率。

示例:

$ ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 -t 60 -y output.ts

上面的命令比較復雜,分別做了這些事:

  • -x264opts "bframes=10:b-adapt=0":設置 B 幀個數為 2 個 P 幀之間包含 10 個 B 幀。
  • -b:v 1000k:設置視頻平均碼率為 1000kbps。
  • -maxrate 1000k:設置視頻最大碼率為 1000kbps。
  • -minrate 1000k:設置視頻最小碼率為 1000kbps。
  • -bufsize 50k:設置編碼的 buffer 大小為 50KB。
  • -nal-hrd cbr:設置 H.264 的編碼 HRD 信號形式為 CBR。
  • -g 50:設置每 50 幀一個 GOP。
  • -sc_threshold 0:設置場景切換不插入關鍵幀。

1.4、流媒體

1)發布 RTMP 流

RTMP 是當下實時直播最常使用的推流協議,關于 RTMP 協議更詳細的介紹,參見《RTMP 協議》

FFmpeg 操作 RTMP 直播流使用的參數:

FFmpeg 操作RTMP常用參數

示例:本地 MP4 視頻文件轉封裝為 FLV 后推流至指定 RTMP 流媒體服務器。

$ ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/room

2)錄制 RTMP 流

示例:RTMP 媒體流保存為 FLV 視頻文件。

$ ffmpeg -i rtmp://localhost:1935/live/room -c copy output.flv

3)錄制 HTTP 流

在流媒體服務中,HTTP 服務是最為常見的,尤其是點播。直播也是可以的,包括 HTTP-FLV、HTTP-TS、HLS。

FFmpeg 操作 HTTP 使用的參數:

FFmpeg 操作HTTP常用參數

示例:拉取并錄制 FLV 直播流。

$ ffmpeg -i http://www.abc.com/live.flv -c copy -f flv output.flv

示例:拉取 TS 直播流流錄制為 FLV。

$ ffmpeg -i http://www.abc.com/live.ts -c copy -f flv output.flv

示例:拉取 HLS 直播流流錄制為 FLV。

$ ffmpeg -i http://www.abc.com/live.m3u8 -c copy -f flv output.flv

2、ffplay 命令行工具

ffplay 是基于 SDL 與 ffmpeg 庫實現的一個播放器,可以使用它來播放原始的 YUV/PCM 數據、編碼后的 H.264/H.265 等數據,封裝好的 MP4/M4A 等數據,或是流媒體數據。

1)播放原始聲音數據

$ ffplay -f <格式名> -ac <聲道數> -ar <采樣率> -i <文件路徑>

其中,-f 表示 PCM 格式,可以用 ffmpeg -formats | grep PCM 命令查看當前支持的格式。

示例:

$ ffplay -f f32le -ac 1 -ar 48000 -i input.pcm

2)播放原始圖像數據

$ ffplay -f <文件格式> -pixel_format <像素格式> -video_size <視頻尺寸> -i <文件路徑>

其中,-pixel_format 表示像素格式,可以用 ffplay -pix_fmts 命令開查看當前支持的格式。

示例:

$ ffplay -f rawvideo -pixel_format yuv420p -video_size 1280x720 -i input.yuv

3)播放編碼數據

使用 ffplay 播放編碼后的視頻或音頻文件如下所示:

$ ffplay -i <文件路徑>

示例:

$ ffplay -i input.h264

4)播放封裝數據

使用 ffplay 播放封裝好的視頻或音頻文件如下所示:

$ ffplay -i <文件路徑>

示例:

$ ffplay -i input.mp4

不過,這里還有一些可能會用到的功能可以關注一下:

4.1)播放控制

在播放音頻或視頻時,使用下列鍵盤按鍵可以進行播放控制:

  • w,切換播放模式,比如在音頻波形圖、音頻頻譜圖、視頻畫面之間切換。
  • s,步進模式,每按一次就播放下一幀圖像。
  • right,快進 10 s。
  • left,快退 10 s。
  • up,快退 1 min。
  • down,快退 1 min。
  • space,暫停。
  • esc,退出。

4.2)循環播放

通過 -loop 指定循環次數。

$ ffplay -loop <循環播放次數> -i <文件路徑>

4.3)播放某一路音頻或視頻

通過 -ast-vst 分別指定音頻流和視頻流編號。

$ ffplay -ast <音頻流編號> -i <文件路徑>$ ffplay -vst <視頻流編號> -i <文件路徑>

如果不存在對應編號的音頻流或視頻流,則靜音或沒有畫面。

4.4)設置音視頻同步方式

通過 -sync 指定音視頻同步方式。

$ ffplay -sync <同步方式> -i <文件路徑>

其中同步方式有 3 種,包括:

  • audio,以音頻時鐘為基準。
  • video,以視頻時鐘為基準。
  • ext,已外部時鐘為基準。

3、ffprobe 命令行工具

ffprobe 是 FFmpeg 源碼編譯后生成的一個可執行程序。ffprobe 是一個很強大的多媒體分析工具,它可以從媒體文件或媒體流中獲得音視頻及媒體容器的參數信息。

1)查看媒體封裝信息

使用 -show_format 來查看媒體封裝信息。

$ ffprobe -show_format <文件路徑>

下面是輸出信息示例及字段含義說明:

[FORMAT]filename=http://www.example.com/1.flvnb_streams=2nb_programs=0format_name=flvformat_long_name=FLV (Flash Video)start_time=4088.213000duration=0.000000size=N/Abit_rate=N/Aprobe_score=100TAG:fileSize=0TAG:audiochannels=2TAG:encoder=xxx[/FORMAT]
  • filename:文件名。
  • nb_streams:封裝的流的數量,對應 AVFormatContext->nb_streams
  • nb_programs:對應 AVFormatContext->nb_programs
  • format_name:封裝格式,對應 AVFormatContext->iformat->name
  • format_long_name:封裝格式完整名,對應 AVFormatContext->iformat->long_name
  • start_time:開始時間,對應 AVFormatContext->start_time,基于 AV_TIME_BASE_Q,單位為秒。
  • duration:時長,對應 AVFormatContext->duration,基于 AV_TIME_BASE_Q,單位為秒。
  • size:大小,對應 avio_size(AVFormatContext->pb),單位字節。
  • bit_rate:碼率,對應 AVFormatContext->bit_rate
  • probe_score:表示輸入媒體文件的格式與其實際數據格式的匹配度,匹配度高則得分高(比如:1.mp4 確實是 mp4 格式),匹配度低則得分低(比如:1.mp4 其實是 wav 的格式)。對應 AVFormatContext->probe_score
  • TAG:*:TAG 是從 metadata dump 處理的信息。

2)查看媒體流信息

使用 -show_streams 來查看媒體流信息。

$ ffprobe -show_streams <文件路徑>

下面是輸出信息示例及字段含義說明:

[STREAM]index=0codec_name=h264codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10profile=Highcodec_type=videocodec_time_base=1/30codec_tag_string=[0][0][0][0]codec_tag=0x0000width=720height=1280coded_width=720coded_height=1280has_b_frames=1sample_aspect_ratio=N/Adisplay_aspect_ratio=N/Apix_fmt=yuv420plevel=31color_range=unknowncolor_space=unknowncolor_transfer=unknowncolor_primaries=unknownchroma_location=leftfield_order=progressivetimecode=N/Arefs=1is_avc=truenal_length_size=4id=N/Ar_frame_rate=15/1avg_frame_rate=15/1time_base=1/1000start_pts=1030start_time=1.030000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=8nb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM][STREAM]index=1codec_name=aaccodec_long_name=AAC (Advanced Audio Coding)profile=LCcodec_type=audiocodec_time_base=1/48000codec_tag_string=[0][0][0][0]codec_tag=0x0000sample_fmt=fltpsample_rate=48000channels=2channel_layout=stereobits_per_sample=0id=N/Ar_frame_rate=0/0avg_frame_rate=0/0time_base=1/1000start_pts=55start_time=0.055000duration_ts=N/Aduration=N/Abit_rate=N/Amax_bit_rate=N/Abits_per_raw_sample=N/Anb_frames=N/Anb_read_frames=N/Anb_read_packets=N/ADISPOSITION:default=0DISPOSITION:dub=0DISPOSITION:original=0DISPOSITION:comment=0DISPOSITION:lyrics=0DISPOSITION:karaoke=0DISPOSITION:forced=0DISPOSITION:hearing_impaired=0DISPOSITION:visual_impaired=0DISPOSITION:clean_effects=0DISPOSITION:attached_pic=0DISPOSITION:timed_thumbnails=0[/STREAM]

視頻流:

  • index:當前流的索引號,對應 AVStream->index

  • codec_name:解碼器名稱,對應 AVCodecDescriptor *cd = avcodec_descriptor_get(AVStream->codecpar->codec_id); cd->name

  • codec_long_name:解碼器全名,對應 cd->long_name

  • profile:編碼等級,通過 avcodec_profile_name(AVStream->codecpar->codec_id, AVStream->codecpar->profile) 獲得。

  • codec_type:流類型,即 av_get_media_type_string(AVStream->codecpar->codec_type)

  • codec_time_base:編碼的時間戳計算基礎單位,對應 AVStream->codec->time_base

  • codec_tag_string:編碼器標簽描述,對應 av_fourcc2str(AVStream->codecpar->codec_tag)

  • codec_tag:對應 AVStream->codecpar->codec_tag

  • width:有效區域的寬度,對應 AVStream->codecpar->width

  • height:有效區域的高度,對應 AVStream->codecpar->height

  • coded_width:視頻幀寬度,可能與上面的寬度不同,因為有一些編碼器要求幀的寬或高是某個數的倍數,所以如果輸入的視頻幀的寬或高不符合對應的規則時,則需要做填充,這里的 coded_width 就是填充后的寬度,在解碼時需要用到這個參數來做對應的裁剪。對應 AVStream->codec->coded_width

  • coded_height:視頻幀高度,可能與上面的高度不同,對應 AVStream->codec->coded_height

  • has_b_frames:是否包含 B 幀。

  • sample_aspect_ratio:簡稱 SAR,指的是圖像采集時,橫向采集點數與縱向采集點數的比例。FFmpeg提供了多個 SAR:AVStream->sample_aspect_ratioAVStream->codecpar->sample_aspect_ratioAVFrame->sample_aspect_ratio,通過 av_guess_sample_aspect_ratio 獲取最終的 SAR。

  • display_aspect_ratio:簡稱 DAR,指的是真正展示的圖像寬高比,在渲染視頻時,必須根據這個比例進行縮放。通過 av_reduce 計算得到,PAR * SAR = DAR,其中 PAR 是 Pixel Aspect Ratio,表示單個像素的寬高比,大多數情況像素寬高比為 1:1,也就是一個正方形像素,如果不是 1:1,則該像素可以理解為長方形像素。

  • pix_fmt:像素格式,對應 av_get_pix_fmt_name(AVStream->codecpar->format)

  • level:編碼參數,對應AVStream->codecpar->level

  • color_range:額外的色彩空間特征,對應 av_color_range_name(AVStream->codecpar->color_range)AVCOL_RANGE_MPEG 對應 TV,AVCOL_RANGE_JPEG 對應 PC。

  • color_space:YUV 彩色空間類型,對應 av_color_space_name(AVStream->codecpar->color_space)

  • color_transfer:顏色傳輸特性,對應 av_color_transfer_name(AVStream->codecpar->color_trc)

  • color_primaries:對應 av_color_primaries_name(AVStream->codecpar->color_primaries)

  • chroma_location:色度樣品的位置,對應 av_chroma_location_name(AVStream->codecpar->chroma_location)

  • field_order:交錯視頻中字段的順序,對應 AVStream->codecpar->field_order

  • timecode:通過 av_timecode_make_mpeg_tc_string 處理 AVStream->codec->timecode_frame_start 獲得。

  • refs:參考幀數量,即 AVStream->codec->refs

  • is_avc:是否 AVC。

  • nal_length_size:表示用幾個字節表示 NALU 的長度。

  • id

  • r_frame_rate:當前流的基本幀率,這個值僅是一個猜測,對應于 AVStream->r_frame_rate

  • avg_frame_rate:平均幀率,對應于 AVStream->avg_frame_rate

  • time_base:AVStream 的時間基準,即 AVStream->time_base

  • start_pts:流開始的 PTS 時間戳,基于 time_base,即 AVStream->start_time

  • start_time:轉換 start_pts * time_base 之后的開始時間,單位秒。

  • duration_ts:流時長,基于 time_base,即 AVStream->duration

  • duration:轉換 duration_ts * time_base 之后的時長,單位秒。

  • bit_rate:碼率,即 AVStream->codecpar->bit_rate

  • max_bit_rate:最大碼率,即 AVStream->codec->rc_max_rate

  • bits_per_raw_sample:每個采樣或像素的比特數,即 AVStream->codec->bits_per_raw_sample

  • nb_frames:視頻流中的幀數,即 AVStream->nb_frames

  • nb_read_frames:略。

  • nb_read_packets:略。

  • TAG:*:對應 AVStream->metadata 中的信息。

  • TAG:rotate:逆時針的旋轉角度(相當于正常視頻的逆時針旋轉角度)。

  • side_data:在視頻流中,有時候我們還會看到 side_data 數據,對應 AVStream->side_data,示例如下:

[SIDE_DATA]// side_data 數據類型,Display Matrix 表示一個 3*3 的矩陣,這個矩陣需要應用到解碼后的視頻幀上,才能正確展示:side_data_type=Display Matrixdisplaymatrix=00000000:   0 65536    000000001: -65536  0    000000002:   0  0 1073741824// 順時針旋轉 90 度還原視頻rotation=-90[/SIDE_DATA]

音頻流:

  • sample_fmt:采樣格式,通過 av_get_sample_fmt_name(AVStream->codecpar->format) 獲取。
  • sample_rate:采樣率,即 AVStream->codecpar->sample_rate
  • channels:聲道數,即 AVStream->codecpar->channels
  • channel_layout:聲道類型,與 channels 是相對應,通過 av_bprint_channel_layout 獲取,比如:mono 表示單聲道,stereo 表示多聲道。

3)查看媒體數據包信息

使用 -show_streams 來查看媒體數據包信息。

$ ffprobe -show_packets <文件路徑>

下面是輸出信息示例及字段含義說明:

[PACKET]codec_type=audiostream_index=0pts=1690083pts_time=1690.083000dts=1690083dts_time=1690.083000duration=23duration_time=0.023000convergence_duration=N/Aconvergence_duration_time=N/Asize=470pos=2757652flags=K_[/PACKET][PACKET]codec_type=videostream_index=1pts=1690232pts_time=1690.232000dts=1690099dts_time=1690.099000duration=33duration_time=0.033000convergence_duration=N/Aconvergence_duration_time=N/Asize=11253pos=2758139flags=__[/PACKET]
  • codec_type:幀類型。audio 表示音頻幀,video 表示視頻幀。
  • stream_index:當前幀所屬流的索引,對應于 AVStream->index
  • pts:幀的展示時間戳,即 AVPacket->pts,基于 AVStream->time_base 時間基準。
  • pts_time:轉換 pts * time_base 之后的時長,單位秒。
  • dts:幀的解碼時間戳,即 AVPacket->dts,基于 AVStream->time_base 時間基準。
  • dts_time:轉換 dts * time_base 之后的時長,單位秒。
  • duration:當前幀的時長,等于下一幀的 pts 減去當前幀 pts,即 AVPacket->duration,基于 AVStream->time_base 時間基準。
  • duration_time:轉換 duration * time_base 之后的時長,單位秒。
  • convergence_duration:略。
  • convergence_duration_time:略。
  • size:當前幀的大小。
  • pos:當前幀的位置,等于上一幀的 pos 加上當前幀的 size。
  • flags:略。

4)查看媒體幀信息

使用 -show_frames 來查看媒體幀信息。

$ ffprobe -show_frames <文件路徑>

下面是輸出信息示例及字段含義說明:

[FRAME]media_type=videostream_index=1key_frame=0pkt_pts=2084699pkt_pts_time=2084.699000pkt_dts=2084699pkt_dts_time=2084.699000best_effort_timestamp=2084699best_effort_timestamp_time=2084.699000pkt_duration=33pkt_duration_time=0.033000pkt_pos=3751477pkt_size=2665width=720height=1280pix_fmt=yuv420psample_aspect_ratio=N/Apict_type=Bcoded_picture_number=334display_picture_number=0interlaced_frame=0top_field_first=0repeat_pict=0color_range=unknowncolor_space=unknowncolor_primaries=unknowncolor_transfer=unknownchroma_location=left[/FRAME][FRAME]media_type=audiostream_index=0key_frame=1pkt_pts=2084707pkt_pts_time=2084.707000pkt_dts=2084707pkt_dts_time=2084.707000best_effort_timestamp=2084707best_effort_timestamp_time=2084.707000pkt_duration=23pkt_duration_time=0.023000pkt_pos=3775354pkt_size=472sample_fmt=fltpnb_samples=1024channels=2channel_layout=stereo[/FRAME]

視頻幀:

  • media_type=:幀類型,即 av_get_media_type_string(AVStream->codecpar->codec_type)
  • stream_index:當前幀所屬流的索引,對應于 AVStream->index
  • key_frame:是否關鍵幀(IDR)。
  • pkt_pts:幀的展示時間戳,即 AVFrame->pts,基于 AVStream->time_base 時間基準。
  • pkt_pts_time:轉換 pkt_pts * time_base 之后的時長,單位秒。
  • pkt_dts:幀的解碼時間戳,即 AVFrame->dts,基于 AVStream->time_base 時間基準。
  • pkt_dts_time:轉換 pkt_dts * time_base 之后的時長,單位秒。
  • best_effort_timestamp:幀時間戳,基本與 pts 相同,如果當前 pts 存在不合理值,會嘗試進行一系列校準來得到這個更合理的值,對應 AVFrame->best_effort_timestamp,基于 AVStream->time_base 時間基準。
  • best_effort_timestamp_time:轉換 best_effort_timestamp * time_base 之后的時長,單位秒。
  • pkt_duration:對應的 AVPacket 的幀時長,即 AVFrame->pkt_duration,基于 AVStream->time_base 時間基準。
  • pkt_duration_time:轉換 pkt_duration * time_base 之后的時長,單位秒。
  • pkt_pos:從最后一個已輸入解碼器的 AVPacket 重新排序的位置,即 AVFrame->pkt_pos
  • pkt_size:對應的 AVPacket 的幀大小,即 AVFrame->pkt_size
  • width:旋轉之前的幀寬度,即 AVFrame->width
  • height:旋轉之前的幀高度,即 AVFrame->height
  • pix_fmt:像素格式,對應 av_get_pix_fmt_name(AVFrame->format)
  • sample_aspect_ratio:簡稱 SAR,指的是圖像采集時,橫向采集點數與縱向采集點數的比例。FFmpeg提供了多個 SAR:AVStream->sample_aspect_ratioAVStream->codecpar->sample_aspect_ratioAVFrame->sample_aspect_ratio,通過 av_guess_sample_aspect_ratio 獲取最終的 SAR。
  • pict_type:視頻幀的圖片類型,即 av_get_picture_type_char(frame->pict_type)
  • coded_picture_number:幀在比特流中的編號,即 AVFrame->coded_picture_number
  • display_picture_number:幀的顯示編號,即 AVFrame->display_picture_number
  • interlaced_frame:視頻幀內容是否是交錯的,即 AVFrame->interlaced_frame
  • top_field_first:若視頻幀內容是交錯的,表示首先展示的頂部域,即 AVFrame->top_field_first
  • repeat_pict:當解碼時,這個信號表明視頻幀必須延遲多少。extra_delay = repeat_pict / (2*fps),即 AVFrame->repeat_pict
  • color_range:額外的色彩空間特征,即 av_color_range_name(AVFrame->color_range)AVCOL_RANGE_MPEG 對應 TV,AVCOL_RANGE_JPEG 對應 PC。
  • color_space:YUV 彩色空間類型,即 av_color_space_name(AVFrame->colorspace)
  • color_primaries:即 av_color_primaries_name(AVFrame->color_primaries)
  • color_transfer:顏色傳輸特性,即 av_color_transfer_name(AVFrame->color_trc)
  • chroma_location:色度樣品的位置,即 av_chroma_location_name(AVFrame->chroma_location)

音頻幀:

  • sample_fmt:采樣格式,通過 av_get_sample_fmt_name(AVFrame->format) 獲取。
  • sample_rate:采樣率,即 AVFrame->sample_rate
  • channels:聲道數,即 AVFrame->channels
  • channel_layout:聲道類型,與 channels 是相對應,通過 av_bprint_channel_layout 獲取,比如:mono 表示單聲道,stereo 表示多聲道。

本文參考

FFmpeg 之 ffprobe

《FFmpeg 從入門到精通》

(通過上文的介紹,我們了解了 ffmpeg、ffplay、ffprobe 等常用的命令用法,這對我們平時的音視頻開發工作非常有用。我們將在后面繼續探討其他好用的音視頻工具,敬請期待)

推薦閱讀

《音頻編碼:PCM、AAC》
《視頻編碼:H.264》
《視頻編碼:H.265》
《視頻編碼:H.266》
《MP4 格式》
《FLV 格式》
《M3U8 格式》

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容