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

相关问题