【问题标题】:ffmpeg/PHP - Problems converting any video format to ogg - Choppy Video / No Audio - win64ffmpeg/PHP - 将任何视频格式转换为 ogg 时出现问题 - 视频断断续续/无音频 - win64
【发布时间】:2013-04-22 13:09:05
【问题描述】:

首先让我道歉,如果这是一个重新发布/类似的帖子,因为我已尽力在此处和谷歌上已经创建的帖子中搜索我的问题的特定解决方案,但不能。

我在 win64 系统上的 localhost 上使用 ffmpeg 创建/测试视频转换脚本,然后再将它们上传到服务器。

我能够成功地转换为/从 mp4/flv/wmv/mov 转换而不会出现问题,但是,每当我尝试从任何其他格式转换为 .ogg 时,都会遇到问题。

首先我尝试了这个:

exec($ffmpegPath." -i ".$srcFile." ".$destFile);

但最终得到一个没有视频/声音的损坏文件。然后我做了一些阅读,发现一些帖子说在转换为 .ogg 时必须显式启用 libvorbis/libtheora,所以我尝试了这个:

$aCodec = ' -acodec libvorbis';
$vCodec = ' -vcodec libtheora';
exec($ffmpegPath." -i ".$srcFile.$aCodec.$vCodec." ".$destFile);

这次我得到了一个有效的 .ogg 文件,有声音,但是,视频输出非常不稳定。为了尝试找到问题,我开始对 exec 行进行编辑,结果如下:

$ffmpegObj = new ffmpeg_movie($srcFile);
$srcVB = intval($ffmpegObj->getVideoBitRate());
$vCodec = ' -vcodec libtheora';
exec($ffmpegPath." -i ".$srcFile.$vCodec." -vb ".$srcVB." ".$destFile);

输出高质量但没有声音的 .ogg 视频。

在需要安装更多软件 (ffmpeg2theora) 等之前,有什么想法可以解决这个问题吗?

另外,如果有帮助,我会回显 ffmpeg 的输出,并且当使用上面的方法 #2 时,会显示许多错误。

100 buffers queued in output stream 0:1, something may be wrong.
[ogg @ 00000000024bf780] st:0 PTS: 6743 DTS: 6743 < 7745 invalid, clipping
[ogg @ 00000000024bf780] st:0 PTS: 6871 DTS: 6871 < 7746 invalid, clipping
[ogg @ 00000000024bf780] st:0 PTS: 6999 DTS: 6999 < 7747 invalid, clipping
[ogg @ 00000000024bf780] st:0 PTS: 7127 DTS: 7127 < 7748 invalid, clipping
[ogg @ 00000000024bf780] st:0 PTS: 7255 DTS: 7255 < 7749 invalid, clipping
[ogg @ 00000000024bf780] st:0 PTS: 7383 DTS: 7383 < 7750 invalid, clipping

libvorbis 和 libtheora 好像不太搭调?

最后,我已经多次更改 ffmpeg.exe 版本,但仍然收到相同的问题。

提前致谢。

编辑:作为一种可能的解决方法,有没有一种方法可以简单地单独编码视频/音频,然后将它们重新组合在一起?这会导致可能的音频/视频同步问题吗?

【问题讨论】:

    标签: php audio video ffmpeg ogg


    【解决方案1】:

    像往常一样,在这里发布我的问题后(​​经过无数小时的故障排除),我相信我可能已经纠正了这个问题。我不仅需要指定用于转换文件的音频/视频编解码器,还需要指定输出 .ogg 视频的音频/视频比特率:

    //CREATE CLASS INSTANCE
    $ffmpegObj = new ffmpeg_movie($srcFile);
    //GET AUDIO BITRATE FROM SOURCE FILE
    $srcAB = intval($ffmpegObj->getAudioBitRate());
    //GET VIDEO BITRATE FROM SOURCE FILE
    $srcVB = intval($ffmpegObj->getVideoBitRate());
    
    //SET THE AUDIO CODEC TO LIBVORBIS
    $aCodec = ' -acodec libvorbis';
    //SET THE VIDEO CODEC TO LIBTHEORA
    $vCodec = ' -vcodec libtheora';
    
    exec($ffmpegPath." -i ".$srcFile.$vCodec." -vb ".$srcVB." -ab ".$srcAB." ".$destFile);
    

    这会输出质量非常接近原始视频格式的视频/音频。

    显然,任何尝试使用上述代码的人都需要添加对 $ffmpegPath/$srcFile/$destFile 的引用,并让 ffmpeg 类可用于他们的脚本。

    此外,最初在我的电脑上本地查看 .ogg 视频时,视频会在第一次开始播放时冻结,然后在几秒钟后跳转到正确的位置(相对于音频),但是,如果重播从一开始就可以毫无问题地播放。我假设我的视频卡达不到标准;这将在转换后第一次查看文件时解释问题。

    在任何情况下,上述代码都适用于使用 ffmpeg 和 php 正确转换为 .ogg 格式时遇到问题的任何其他人。

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多