FFmpeg 圖片合成影片

uu365發表於2021-05-24

  FFmpeg將多張圖片合成影片,影片的總幀數:總幀數 = duration * fps ,duration是我們設定的影片的長度,fps是影片每秒的幀數。

  對於圖片檔案是沒有幀率的概念,FFmpeg預設情況下一秒25張圖片成像合成影片。因此FFmpeg提供-framerate還有-r設定輸入的影片幀率,-r 8說明每秒鐘將8張圖片合成影片。設定了輸入幀率之後,如果輸出幀率沒有指定,輸出幀率將跟輸入幀率保持一致

  場景

  將bmp圖片合成影片

  ffmpeg -r 8 -i ./RecordTemp/%d.bmp  -vcodec mpeg4 test.mp4

  ffmpeg -r 8 -i  %d.bmp -vcodec libx264 test.mp4

  其中-r 和-framerate 都是代表幀率(這個屬性屬於圖片的屬性,需要放在圖片之前)

  1)控制影片幀率

  -r fps 幀率,可以指定兩個幀率,輸入幀率,輸出幀率;

  輸入幀率:-i之前,設定讀入幀率,比如 -r 0.5 ,也就是說1秒要播0.5個圖片,那麼一個圖也就是要播2s;

  輸出頻率:-i之後,真正的輸出影片播放幀率,不寫話,是預設和輸入頻率一樣。比如設 -r 30 ,對應上面的設定,一個圖播2s,那麼輸出檔案播放時,這2s內,都是這張圖,但是播放了60幀

  2)圖片合成影片,然後影片拆分成圖片數量對應不上

  指令如下:

  ffmpeg  -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4 -r 20 D:/ffmpeg/video5.avi

  ffmpeg -i video5.avi  -f image2 image-%07d.png

  解答:-r 20 放在-i之後指定的是輸出影片幀率,輸入幀率預設情況下是25,所以拆分之後跟原始圖片數量對應不上

  解決方案:ffmpeg -r 20 -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4  D:/ffmpeg/video5.avi

  3)輸出的影片畫面質量下降,原因:影響影片質量的最重要因素是影片位元速率,輸出影片的位元速率是預設的,只有200kbits/s

  解決方案:修改預設的影片位元速率屬性-b:v

  ffmpeg -r 20  -i "D:/ffmpeg/RecordTemp/%06d.bmp" -vcodec mpeg4 -b:v 6000k D:/ffmpeg/video5.avi

  注意:當不清楚輸出位元速率應該設定為多少,可以指定一個比較大的數字

  4)指定從拿一張圖片開始合成影片

  ffmpeg -start_number 500 -i pano%d.jpg video.avi

  備註下

  -t duration

  用做輸入選項(在-i之前),是限制讀取輸入檔案的的時長;

  用做輸出選項(before an output url),超過這個時間停止寫輸出檔案;

  比如:迴圈讀取一個輸入檔案時(-loop 1),當到時間就會停止輸出,生成一個duration時長的影片。但是如果沒有迴圈選項,而且輸入檔案短於這個時長時,就會隨著輸入檔案結束就結束,生成影片,影片時長小於duration。所以我們可以看出 -t 並不僅僅是輸出檔案時長。

  當用“管道”時,也不太一樣,管道讀了之後,裡面內容就沒了,所以沒持續的輸入,這個-loop,-t 都是“不起作用的”,除非管道一直有內容。

  ffmpeg -threads2 -y -r 10 -i /tmpdir/image%04d.jpg -i audio.mp3 -absf aac_adtstoasc output.mp4

  引數的解釋含義:

  -threads 2 以兩個執行緒進行執行, 加快處理的速度。

  -y 對輸出檔案進行覆蓋

  -r 10 fps設定為10幀/秒(不同位置有不同含義,後面再解釋)

  -i /tmpdir/image%04d.jpg 輸入圖片檔案,圖片檔案儲存為 image0001.jpg image0002.jpg ….

  -i audio.mp3 輸入的音訊檔案

  -absf aac_adtstoasc 將結果的音訊格式轉為faac格式時需要這個選項。將音訊格式轉為faac是因為在iphone上某些音訊格式的影片無法播放,例如mp3. 但faac格式的音訊的影片在iphone上可以播放。-absf 的意思是設定一個bitstream filter進行某些轉換。可以用ffmpeg -bsfs 檢視所有支援的bitstream filter。 bitstream filter和 aac_adtstoasc的具體含義我也說不上。但是如果不用這個選項又會導致轉換失敗。

  記錄

  bmp轉換失敗:

  原因:提供的bmp圖片檔案,實際上是png格式的圖片檔案,經過批處理修改字尾名稱,解決問題

  排查過程:

  1)透過Windows畫圖工具,重新儲存成bmp檔案,合成影片成功

  2)透過Windows畫圖工具,重新另存為jpg檔案,合成影片成功

  說明是檔案格式的問題

  登入後複製

  Microsoft Windows [版本 10.0.18363.1316]

  (c) 2019 Microsoft Corporation。保留所有權利。

  F:\test\test_old\store>ffmpeg -i test_%d.bmp -vcodec mpeg4 test.avi

  ffmpeg version git-2020-08-16-5df9724 Copyright (c) 2000-2020 the FFmpeg developers

  built with gcc 10.2.1 (GCC) 20200805

  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libgsm --enable-librav1e --enable-libsvtav1 --disable-w32threads --enable-libmfx --enable-ffnvcodec --enable-cuda-llvm --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt --enable-amf

  libavutil      56. 58.100 / 56. 58.100

  libavcodec     58.100.100 / 58.100.100

  libavformat    58. 51.100 / 58. 51.100

  libavdevice    58. 11.101 / 58. 11.101

  libavfilter     7. 87.100 /  7. 87.100

  libswscale      5.  8.100 /  5.  8.100

  libswresample   3.  8.100 /  3.  8.100

  libpostproc    55.  8.100 / 55.  8.100

  [bmp @ 0000024bbbb5fd00] bad magic number

  Last message repeated 7 times

  [image2 @ 0000024bbbb5ddc0] decoding for stream 0 failed

  [image2 @ 0000024bbbb5ddc0] Could not find codec parameters for stream 0 (Video: bmp, none): unspecified size

  Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options

  Input #0, image2, from 'test_%d.bmp':

  Duration: 00:00:00.32, start: 0.000000, bitrate: N/A

  Stream #0:0: Video: bmp, none, 25 fps, 25 tbr, 25 tbn, 25 tbc

  Stream mapping:

  Stream #0:0 -> #0:0 (bmp (native) -> mpeg4 (native))

  Press [q] to stop, [?] for help

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  [bmp @ 0000024bbbb60500] bad magic number

  Error while decoding stream #0:0: Invalid data found when processing input

  Cannot determine format of input stream 0:0 after EOF

  Error marking filters as finished

  Conversion failed!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69997029/viewspace-2773600/,如需轉載,請註明出處,否則將追究法律責任。

相關文章