1. 程式人生 > 程式設計 >FFmpeg map引數選擇音視訊流

FFmpeg map引數選擇音視訊流

FFmpeg命令列map引數選擇音視訊流


介紹

  • -map引數告訴ffmpeg要從輸入源中選擇/拷貝哪個stream流到輸出,可以從輸入源中選擇多個音視訊流作為輸出。

  • 不加-map引數,ffmpeg預設從輸入源中的視訊流和音訊流各選擇一個流。

  • 輸出流/檔案的stream順序取決於在命令列中-map的引數順序。


預設情況

預設情況下(沒有使用-map引數),比如:

ffmpeg -i 0001.ts -c copy -f mpegts  udp://192.168.1.100&pkt_size=1316
複製程式碼

FFmpeg會預設從所有輸入流中找到[最高質量的一個視訊輸入流]和[最高質量的一個音訊輸入流

],並拷貝流輸出udp輸出流。其他流實質上會被丟棄。

如果使用map命令顯示與上面命令相同的操作,它的命令如下:

ffmpeg -i 0001.ts \
        -map single_highest_quality_video_stream_from_all_inputs \
        -map single_highest_quality_audio_stream_from_all_inputs \
        -c copy -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼

此處輸出將有兩個流,一個音訊,一個視訊。


指定輸入流中的音視訊流

例子,0001.ts是個單視訊流,多音訊流的資訊如下:

  1. Stream #0:0 是視訊流
  2. Stream #0:1 ~ Stream #0:3 是音訊流
  3. Stream #0:4 是字幕流
Input #0,mpegts,from '0001.ts':
  Duration: 00:04:46.23,start: 57251.747478,bitrate: 5861 kb/s
  Program 34 
    Metadata:
      service_name    : Test TV HD
      service_provider: TV5
    Stream #0:0[0x53d]: Video: h264 (High) ([27][0][0][0] / 0x001B),yuv420p(tv,bt470bg,top first),1920x1080 [SAR 1:1 DAR 16:9],25 fps,50 tbr,90k tbn,50 tbc
Stream #0:1[0x53e](THA): Audio: aac_latm (HE-AACv2) ([17][0][0][0] / 0x0011),48000 Hz,stereo,fltp Stream #0:2[0x53f](QAA): Audio: aac_latm (HE-AACv2) ([17][0][0][0] / 0x0011),fltp Stream #0:3[0x540](NAR): Audio: aac_latm (LC) ([17][0][0][0] / 0x0011),fltp Stream #0:4[0x541](tha): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) 複製程式碼
01 如要要指定取多視訊和多音訊流中的一路流,要怎麼處理呢?

如下命令:

-map 0:0 -map 0:2

選擇輸入源中Stream #0:0的視訊流,Stream #0:2的音訊流,拷貝選擇的音視訊流輸出到udp輸出流

ffmpeg -i 0001.ts -map 0:0 -map 0:2 -c copy -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼
02 如要要指定取單路視訊流和多路音訊流,要怎麼處理呢?

如下命令:

-map 0:0 -map 0:1 -map 0:2 -map 0:3

選擇輸入源中Stream #0:0的視訊流,Stream #0:0Stream #0:1Stream #0:3的三路音訊流,拷貝選擇的音視訊流輸出到udp輸出流

ffmpeg -i 0001.ts -map 0:0 -map 0:1 -map 0:2 -map 0:3 \ 
       -c copy -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼
03 如要要取所有的視訊和音訊流,要怎麼處理呢?

如下命令:

-map 0:a -map 0:v

選擇輸入源中所有視訊流和所有的音訊,拷貝所有的音視訊流輸出到udp流中

ffmpeg -i 0001.ts -map 0:a -map 0:v -c copy -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼
04 如要要取所有流(包括字幕流等),要怎麼處理呢?

如下命令:

-map 0

選擇輸入源中所有的流,拷貝所有的流輸出到udp流中

ffmpeg -i 0001.ts -map 0 -c copy -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼

指定輸入流中的多音視訊流編碼格式

有時處理輸入源中的多視訊和多音訊流時,想針對不同音視訊流做不同的編碼處理

如下命令:

  • Stream #0:0視訊流拷貝複製
  • Stream #0:1Stream #0:2音訊流拷貝複製
  • Stream #0:2音訊流編碼為mp3格式(128kbps)
  • Stream #0:4字幕流拷貝複製
fffmpeg -i 0001.ts -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:4 \
        - c:v copy \
        - c:a:0 copy \
        - c:a:1 copy \
        - c:a:2 libmp3lame -b:a:2 128k \
        - c:s copy \
        -f mpegts  "udp://192.168.1.100:1234?pkt_size=1316"
複製程式碼