如何检测已转换文件中存在的音频或视频或两者

时间:2013-07-25 08:43:03

标签: ffmpeg video-streaming audio-streaming video-capture mencoder

我正在尝试使用以下(mencoder)命令将mp4或3gp视频文件转换为Flash(flv)格式(使用Perl脚本):

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命令有助于转换为mencoder失败的flv。

我正在考虑一些解决方案,需要检查转换后的flv是否有音频和视频然后才会采取行动取决于它。你能帮我解决这个问题吗?

以下是更多信息(日志):

[mov,mp4,m4a,3gp,3g2,mj2 @ 0xb6b9a3a0]多个编辑列表条目,可能会发生a / v desync,欢迎修补 ** MUXER_LAVF * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *** 记住:MEncoder的libavformat多路复用器目前已被破坏,可以生成 在存在B帧的情况下INCORRECT文件。而且,由于MPlayer的漏洞 将播放这些INCORRECT文件,好像什么都没有错!


不支持的PixelFormat 61 不支持的PixelFormat 53 不支持的PixelFormat 81 [flv @ 0xb6b9a3a0]流0的编解码器不使用全局头,但容器格式需要全局头 [flv @ 0xb6b9a3a0]流1的编解码器不使用全局头,但容器格式需要全局头 [flv @ 0xb6b9a3a0] pts<在流0中的dts 写帧时出错。

[flv @ 0xb6b9a3a0] pts<在流0中的dts 写帧时出错。

[flv @ 0xb6b9a3a0] pts<在流0中的dts 写帧时出错。

[flv @ 0xb6b9a3a0] pts<在流0中的dts 写帧时出错。

[flv @ 0xb6b9a3a0] pts<在流0中的dts 写帧时出错。

跳过框架!

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

2 个答案:

答案 0 :(得分:6)

可能的解决方案是:

  1. 使用ffmpeg或ffprobe分析输出文件

    ffmpeg -i test.flv

  2. 具有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输出是否包含类似“Stream#.....:Video”和“Stream#.....:Audio”的内容。您可以在所有主要shell和语言中实现和使用正则表达式。
    2. 示例:

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

答案 1 :(得分:3)

这应该可以解决问题。

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 ,