FFmpeg/PHP - 转换任何视频格式为ogg的问题 - 视频卡顿/无音频 - win64

3

首先向大家道歉,如果这是一个重复的帖子/相似的帖子,我尽力在已经创建的帖子和谷歌上搜索了特定的解决方案来解决我的问题,但是没有找到。

我正在使用位于win64系统上的本地主机上的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输出了一些内容,并且当使用以上第二种方法时,会显示许多错误信息。

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版本,但仍然遇到同样的问题。

提前致谢。

编辑:可能的解决方法是,是否可以将视频/音频分别编码,然后将它们重新组合在一起?这会导致可能的音频/视频同步问题吗?

1个回答

2

像往常一样,在无数小时的疯狂排查后,我在这里发布了我的问题,并且我相信我可能已经解决了这个问题。我需要指定转换文件的音频/视频编解码器以及输出.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类可用。
此外,在我本地的PC上首次在Firefox中查看.ogg视频时,视频会在开始播放时冻结,然后在几秒钟后跳到正确的位置(相对于音频),但是,如果重新开始播放,则可以正常播放。 我认为我的视频卡不够好,这就解释了转换文件后首次查看文件时出现的问题。
无论如何,上述代码应该适用于任何其他人使用ffmpeg和php转换为.ogg格式时遇到问题的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接