def test_ffmpeg_thumbnail(self): f = ffmpeg.FFMpeg() thumb = self.shot_file_path thumb2 = self.shot2_file_path self.assertRaisesSpecific(IOError, f.thumbnail, 'nonexistent', 10, thumb) self.ensure_notexist(thumb) f.thumbnail('test1.ogg', 10, thumb) self.assertTrue(os.path.exists(thumb)) self.ensure_notexist(thumb) self.assertRaisesSpecific(ffmpeg.FFMpegError, f.thumbnail, 'test1.ogg', 34, thumb) self.assertFalse(os.path.exists(thumb)) # test multiple thumbnail self.ensure_notexist(thumb) self.ensure_notexist(thumb2) f.thumbnails( 'test1.ogg', [ (5, thumb), (10, thumb2, None, 5), # set quality (5, self.shot3_file_path, '320x240'), # set size ]) self.assertTrue(os.path.exists(thumb)) self.assertTrue(os.path.exists(thumb2)) self.assertTrue(os.path.exists(self.shot3_file_path))
def test_ffmpeg_convert(self): f = ffmpeg.FFMpeg() def consume(fn, *args, **kwargs): return list(fn(*args, **kwargs)) self.assertRaisesSpecific(ffmpeg.FFMpegError, consume, f.convert, 'nonexistent', self.video_file_path, []) self.assertRaisesSpecific(ffmpeg.FFMpegConvertError, consume, f.convert, '/etc/passwd', self.video_file_path, []) info = f.probe('test1.ogg') convert_options = [ '-acodec', 'libvorbis', '-ab', '16k', '-ac', '1', '-ar', '11025', '-vcodec', 'libtheora', '-r', '15', '-s', '360x200', '-b', '128k' ] conv = f.convert('test1.ogg', self.video_file_path, convert_options) last_tc = 0.0 for tc in conv: assert (last_tc < tc <= info.format.duration + 0.1), ( last_tc, tc, info.format.duration) self._assert_converted_video_file()
def test_ffmpeg_probe(self): self.assertRaisesSpecific(ffmpeg.FFMpegError, ffmpeg.FFMpeg, ffmpeg_path='/foo', ffprobe_path='/bar') f = ffmpeg.FFMpeg() self.assertEqual(None, f.probe('/nonexistent')) self.assertEqual(None, f.probe('/dev/null')) info = f.probe('test1.ogg') self.assertEqual('ogg', info.format.format) self.assertAlmostEqual(33.00, info.format.duration, places=2) self.assertEqual(2, len(info.streams)) v = info.streams[0] self.assertEqual(v, info.video) self.assertEqual('video', v.type) self.assertEqual('theora', v.codec) self.assertEqual(720, v.video_width) self.assertEqual(400, v.video_height) self.assertAlmostEqual(25.00, v.video_fps, places=2) a = info.streams[1] self.assertEqual(a, info.audio) self.assertEqual('audio', a.type) self.assertEqual('vorbis', a.codec) self.assertEqual(2, a.audio_channels) self.assertEqual(48000, a.audio_samplerate) self.assertEqual(repr(info), 'MediaInfo(format=MediaFormatInfo(format=ogg, duration=33.00), streams=[MediaStreamInfo(type=video, codec=theora, width=720, height=400, fps=25.0), MediaStreamInfo(type=audio, codec=vorbis, channels=2, rate=48000)])')
def test_ffmpeg_termination(self): # test when ffmpeg is killed f = ffmpeg.FFMpeg() convert_options = [ '-acodec', 'libvorbis', '-ab', '16k', '-ac', '1', '-ar', '11025', '-vcodec', 'libtheora', '-r', '15', '-s', '360x200', '-b', '128k'] p_list = {} # modifiable object in closure f._spawn = lambda *args: p_list.setdefault('', ffmpeg.FFMpeg._spawn(*args)) conv = f.convert('test1.ogg', self.video_file_path, convert_options) conv.next() # let ffmpeg to start p = p_list[''] p.terminate() self.assertRaisesSpecific(ffmpeg.FFMpegConvertError, list, conv)
def test_ffmpeg_thumbnail(self): f = ffmpeg.FFMpeg() thumb = '/tmp/shot.png' self.assertRaisesSpecific(IOError, f.thumbnail, '/nonexistent', 10, thumb) self.ensure_notexist(thumb) f.thumbnail('test1.ogg', 10, thumb) self.assertTrue(os.path.exists(thumb)) self.ensure_notexist(thumb) self.assertRaisesSpecific(ffmpeg.FFMpegError, f.thumbnail, 'test1.ogg', 34, thumb) self.assertFalse(os.path.exists(thumb))
def test_ffmpeg_probe(self): self.assertRaisesSpecific(ffmpeg.FFMpegError, ffmpeg.FFMpeg, ffmpeg_path='/foo', ffprobe_path='/bar') f = ffmpeg.FFMpeg(ffmpeg_path="ffmpeg-3.2.10", ffprobe_path="ffprobe-3.2.10") self.assertEqual(None, f.probe('nonexistent')) self.assertEqual(None, f.probe('/dev/null')) info = f.probe('test1.ogg') self.assertEqual('ogg', info.format.format) self.assertAlmostEqual(33.00, info.format.duration, places=2) self.assertEqual(2, len(info.streams)) v = info.streams[0] self.assertEqual(v, info.video) self.assertEqual('video', v.type) self.assertEqual('theora', v.codec) self.assertEqual(720, v.video_width) self.assertEqual(400, v.video_height) self.assertEqual(None, v.bitrate) self.assertAlmostEqual(25.00, v.video_fps, places=2) self.assertEqual(v.metadata['ENCODER'], 'ffmpeg2theora 0.19') a = info.streams[1] self.assertEqual(a, info.audio) self.assertEqual('audio', a.type) self.assertEqual('vorbis', a.codec) self.assertEqual(2, a.audio_channels) self.assertEqual(80000, a.bitrate) self.assertEqual(48000, a.audio_samplerate) self.assertEqual(a.metadata['ENCODER'], 'ffmpeg2theora 0.19') self.assertEqual( repr(info), 'MediaInfo(format=MediaFormatInfo(duration=32.996875, format=ogg, ), streams=[' 'MediaStreamInfo(type=video, codec=theora, width=720, height=400, fps=25.0, ENCODER=ffmpeg2theora 0.19), ' 'MediaStreamInfo(type=audio, codec=vorbis, channels=2, rate=48000, bitrate=80000, ENCODER=ffmpeg2theora 0.19)])' )
def _assert_converted_video_file(self): """ Asserts converted test1.ogg (in path self.video_file_path) is converted correctly """ f = ffmpeg.FFMpeg() info = f.probe(self.video_file_path) self.assertEqual('ogg', info.format.format) self.assertAlmostEqual(33.00, info.format.duration, places=0) self.assertEqual(2, len(info.streams)) self.assertEqual('video', info.video.type) self.assertEqual('theora', info.video.codec) self.assertEqual(360, info.video.video_width) self.assertEqual(200, info.video.video_height) self.assertAlmostEqual(15.00, info.video.video_fps, places=2) self.assertEqual('audio', info.audio.type) self.assertEqual('vorbis', info.audio.codec) self.assertEqual(1, info.audio.audio_channels) self.assertEqual(11025, info.audio.audio_samplerate)
def test_ffmpeg_convert(self): f = ffmpeg.FFMpeg() def consume(fn, *args, **kwargs): return list(fn(*args, **kwargs)) self.assertRaisesSpecific(ffmpeg.FFMpegError, consume, f.convert, 'nonexistent', self.video_file_path, []) self.assertRaisesSpecific(ffmpeg.FFMpegConvertError, consume, f.convert, '/etc/passwd', self.video_file_path, []) info = f.probe('test1.ogg') conv = f.convert('test1.ogg', self.video_file_path, [ '-acodec', 'libvorbis', '-ab', '16k', '-ac', '1', '-ar', '11025', '-vcodec', 'libtheora', '-r', '15', '-s', '360x200', '-b', '128k' ]) last_tc = 0.0 for tc in conv: assert (tc > last_tc and tc <= info.format.duration + 0.1), (last_tc, tc, info.format.duration) info = f.probe(self.video_file_path) self.assertEqual('ogg', info.format.format) self.assertAlmostEqual(33.00, info.format.duration, places=0) self.assertEqual(2, len(info.streams)) self.assertEqual('video', info.video.type) self.assertEqual('theora', info.video.codec) self.assertEqual(360, info.video.video_width) self.assertEqual(200, info.video.video_height) self.assertAlmostEqual(15.00, info.video.video_fps, places=2) self.assertEqual('audio', info.audio.type) self.assertEqual('vorbis', info.audio.codec) self.assertEqual(1, info.audio.audio_channels) self.assertEqual(11025, info.audio.audio_samplerate)