2

我試圖MP4或3GP視頻文件轉換到Flash(FLV)格式(使用Perl腳本),使用以下(mencoder的)命令:如何檢測音頻或視頻或在轉換後的文件都存在

mencoder test.mp4 -of lavf -ovc lavc -lavcopts vcodec=flv:vbitrate=1000:mbd=2 -fps 20.80 -ofps 20.80 -oac mp3lame -lameopts abr:br=32 -srate 22050 -o test.flv 

它工作正常,但有些文件來自手機附件有問題,轉換後的FLV文件只有音頻。

我也用ffmpeg的命令如下:

ffmpeg -i test.mp4 -ar 22050 -acodec libmp3lame -ab 32K -r 25 -vcodec flv test.flv 

這ffmpeg的命令有助於轉換成FLV,這是由mencoder失敗。

我在想一些類似的解決方案,需要檢查轉換後的flv是否有音頻和視頻,然後將採取行動取決於它。你能幫我解決這個問題嗎?

下面是更多的一些信息(日誌):

[MOV,MP4,M4A,3GP,3G2,MJ2 @ 0xb6b9a3a0]多個編輯列表條目,則可能會出現A/V不同步,補丁歡迎 * * MUXER_LAVF * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *** 記住:用於MEncoder的libavformat流複用目前碎而產生B幀中的存在不正確 文件。此外,由於錯誤,MPlayer 將播放這些錯誤的文件,就好像沒有錯誤!


不受支持的PixelFormat 61 不受支持的PixelFormat 53 不受支持的PixelFormat 81 [FLV @ 0xb6b9a3a0]編解碼器用於流0不使用全局頭部但容器格式需要全局頭部 [FLV @ 0xb6b9a3a0]編解碼器用於流1確實不使用全局標題,但容器格式需要全局標題 [flv @ 0xb6b9a3a0] pts <流中的dts 0 寫入幀時發生錯誤。

[flv @ 0xb6b9a3a0] pts <流中的dts 0 寫入幀時出錯。

[flv @ 0xb6b9a3a0] pts <流中的dts 0 寫入幀時出錯。

[flv @ 0xb6b9a3a0] pts <流中的dts 0 寫入幀時出錯。

[flv @ 0xb6b9a3a0] pts <流中的dts 0 寫入幀時出錯。

跳幀!

.........................

+0

如果它適用於ffmpeg而不是mencoder,那麼爲什麼不使用ffmpeg? – LordNeckbeard

+0

ffmpeg不是100%的工作,它無法轉換一些mp4文件。我需要用這兩個來解決我的問題。問題:如何檢測(使用mencoder或ffmpeg)轉換文件中是否存在音頻和視頻。 –

+0

請顯示完整的ffmpeg控制檯輸出,以查找無法轉換某些mp4文件的命令。 – LordNeckbeard

回答

5

一種可能的解決方案是:

  1. 使用的ffmpeg或ffprobe分析輸出文件,

    的ffmpeg -i test.flv

與A/V流文件中的命令行輸出應該是這樣的:

ffmpeg -i test.flv 
ffmpeg version N-53818-gfca435f Copyright (c) 2000-2013 the FFmpeg developers 
built on Jun 4 2013 01:41:53 with gcc 4.7.3 (GCC) 
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-liray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enabibopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enablevpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib 
libavutil  52. 34.100/52. 34.100 
libavcodec  55. 15.100/55. 15.100 
libavformat 55. 8.102/55. 8.102 
libavdevice 55. 2.100/55. 2.100 
libavfilter  3. 74.101/3. 74.101 
libswscale  2. 3.100/2. 3.100 
libswresample 0. 17.102/0. 17.102 
libpostproc 52. 3.100/52. 3.100 
Input #0, flv, from 'test.flv': 
Metadata: 
starttime  : 0 
totalduration : 5162 
totaldatarate : 583 
bytelength  : 376445710 
canseekontime : true 
sourcedata  : BD075FAE3HH1363450117735644 
purl   : 
pmsg   : 
Duration: 01:26:01.70, start: 0.000000, bitrate: 533 kb/s 
Stream #0:0: Video: h264 (Main), yuv420p, 640x356, 457 kb/s, 23.98 tbr, 1k tbn, 47.95 tbc 
Stream #0:1: Audio: aac, 44100 Hz, stereo, fltp, 131 kb/s 
  1. 使用正則表達式匹配來檢測,如果ffmpeg的輸出包含類似「流#.....:視頻」和「流#.....:音頻」。您可以在所有主要的shell和語言中實現和使用正則表達式。

實施例:

"^\s+Stream.+Video." and ^\s+Stream.+Audio. 
0

這應該解決的問題。

ffmpeg -i test.avi 2>&1 | grep Audio | awk '{print $0}' | tr -d , 

ffmpeg -i test.avi 2>&1 | grep Video | awk '{print $0}' | tr -d , 
+0

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。 – abarisone

相關問題