diff --git a/CHANGELOG.md b/CHANGELOG.md
index f5785b1..5b92988 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,7 @@
 # v0.20.0
-- Add new parameter `gain_during_overlay` to `pydub.AudioSegment.overlay` which allows users to adjust the volume of the target AudioSegment during the portion of the segment which is overlaid with the additional AudioSegment. 
+- Add new parameter `gain_during_overlay` to `pydub.AudioSegment.overlay` which allows users to adjust the volume of the target AudioSegment during the portion of the segment which is overlaid with the additional AudioSegment.
+- `pydub.playback.play()` No longer displays the (very verbose) playback "banner" when using ffplay
+- Fix a confusing error message when using invalid crossfade durations (issue #193)
 
 # v0.19.0
 - Allow codec and ffmpeg/avconv parameters to be set in the `pydub.AudioSegment.from_file()` for more control while decoding audio files
diff --git a/pydub/audio_segment.py b/pydub/audio_segment.py
index 2ad6dd9..5d497b9 100644
--- a/pydub/audio_segment.py
+++ b/pydub/audio_segment.py
@@ -488,7 +488,7 @@ class AudioSegment(object):
         if codec:
             # force audio decoder
             conversion_command += ["-acodec", codec]
-            
+
         conversion_command += [
             "-i", input_file.name,  # input_file options (filename last)
             "-vn",  # Drop any video streams if there are any
@@ -943,6 +943,14 @@ class AudioSegment(object):
 
         if not crossfade:
             return seg1._spawn(seg1._data + seg2._data)
+        elif crossfade > len(self):
+            raise ValueError("Crossfade is longer than the original AudioSegment ({}ms > {}ms)".format(
+                crossfade, len(self)
+            ))
+        elif crossfade > len(seg):
+            raise ValueError("Crossfade is longer than the appended AudioSegment ({}ms > {}ms)".format(
+                crossfade, len(seg)
+            ))
 
         xf = seg1[-crossfade:].fade(to_gain=-120, start=0, end=float('inf'))
         xf *= seg2[:crossfade].fade(from_gain=-120, start=0, end=float('inf'))
diff --git a/pydub/playback.py b/pydub/playback.py
index ae392ee..a162152 100644
--- a/pydub/playback.py
+++ b/pydub/playback.py
@@ -1,7 +1,7 @@
 """
 Support for playing AudioSegments. Pyaudio will be used if it's installed,
 otherwise will fallback to ffplay. Pyaudio is a *much* nicer solution, but
-is tricky to install. See my notes on installing pyaudio in a virtualenv (on 
+is tricky to install. See my notes on installing pyaudio in a virtualenv (on
 OSX 10.10): https://gist.github.com/jiaaro/9767512210a1d80a8a0d
 """
 
@@ -23,7 +23,7 @@ def _play_with_pyaudio(seg):
     import pyaudio
 
     p = pyaudio.PyAudio()
-    stream = p.open(format=p.get_format_from_width(seg.sample_width),  
+    stream = p.open(format=p.get_format_from_width(seg.sample_width),
                     channels=seg.channels,
                     rate=seg.frame_rate,
                     output=True)
@@ -32,10 +32,10 @@ def _play_with_pyaudio(seg):
     for chunk in make_chunks(seg, 500):
         stream.write(chunk._data)
 
-    stream.stop_stream()  
-    stream.close()  
+    stream.stop_stream()
+    stream.close()
 
-    p.terminate()  
+    p.terminate()
 
 
 def play(audio_segment):
diff --git a/setup.py b/setup.py
index 1f191b1..b9b8162 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ from setuptools import setup
 
 setup(
     name='pydub',
-    version='0.19.0',
+    version='0.20.0',
     author='James Robert',
     author_email='jiaaro@gmail.com',
     description='Manipulate audio with an simple and easy high level interface',

Error when attempting to crossfade with duration longer than one of the files
### Steps to reproduce
Create an audio segment from a sound file.  Attempt to append a second sound file, with a crossfade duration longer than the actual sound file.

### Expected behavior
Either an error message that explains the issue, or a default to crossfading with the maximum length that would be possible.

### Actual behavior
A TooManyMissingFrames exception is thrown from an unintuitive place.

### Your System configuration
- Python version: 3.5.2
- Pydub version: 0.18.0
- ffmpeg or avlib?: ffmpeg
- ffmpeg/avlib version: 2.8.11-0ubuntu0.16.04.1


diff --git a/test/test.py b/test/test.py
index f42b722..9eea471 100644
--- a/test/test.py
+++ b/test/test.py
@@ -142,6 +142,11 @@ class AudioSegmentTests(unittest.TestCase):
         self.assertEqual(len(merged1), len(self.seg1) + len(self.seg3) - 100)
         self.assertEqual(len(merged2), len(self.seg2) + len(self.seg3) - 100)
 
+    def test_too_long_crossfade(self):
+        s1 = self.seg1[:1000]
+        s2 = self.seg2[:500]
+        self.assertRaises(ValueError, lambda: s1.append(s2, crossfade=len(s1) + 10))
+
     def test_sum(self):
         def gen():
             yield self.seg1

pip install -e .
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y ffmpeg
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
-e git+https://github.com/jiaaro/pydub.git@13c9d045b4afdfbcbfa0d24d24aeba3df2ca64dc#egg=pydub
pytest @ file:///croot/pytest_1738938843180/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work

name: pydub
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/pydub

test/test.py::AudioSegmentTests::test_too_long_crossfade
test/test.py::UtilityTests::test_db_float_conversions test/test.py::FileAccessTests::test_audio_segment_from_mp3 test/test.py::AudioSegmentTests::test_24_bit_audio test/test.py::AudioSegmentTests::test_append test/test.py::AudioSegmentTests::test_apply_gain_stereo test/test.py::AudioSegmentTests::test_array_type test/test.py::AudioSegmentTests::test_autodetect_format test/test.py::AudioSegmentTests::test_compress test/test.py::AudioSegmentTests::test_concat test/test.py::AudioSegmentTests::test_dBFS test/test.py::AudioSegmentTests::test_direct_instantiation_with_bytes test/test.py::AudioSegmentTests::test_duration test/test.py::AudioSegmentTests::test_empty test/test.py::AudioSegmentTests::test_equal_and_not_equal test/test.py::AudioSegmentTests::test_export_as_mp3 test/test.py::AudioSegmentTests::test_export_as_ogg test/test.py::AudioSegmentTests::test_export_as_raw test/test.py::AudioSegmentTests::test_export_as_wav test/test.py::AudioSegmentTests::test_export_forced_codec test/test.py::AudioSegmentTests::test_export_mp3_as_ogg test/test.py::AudioSegmentTests::test_export_mp3_as_webm test/test.py::AudioSegmentTests::test_export_mp3_with_tags test/test.py::AudioSegmentTests::test_export_mp4_as_mp3 test/test.py::AudioSegmentTests::test_export_mp4_as_mp3_with_tags test/test.py::AudioSegmentTests::test_export_mp4_as_mp3_with_tags_raises_exception_when_id3version_is_wrong test/test.py::AudioSegmentTests::test_export_mp4_as_mp3_with_tags_raises_exception_when_tags_are_not_a_dictionary test/test.py::AudioSegmentTests::test_export_mp4_as_ogg test/test.py::AudioSegmentTests::test_export_mp4_as_wav test/test.py::AudioSegmentTests::test_export_ogg_as_mp3 test/test.py::AudioSegmentTests::test_export_webm_as_mp3 test/test.py::AudioSegmentTests::test_exporting_to_ogg_uses_default_codec_when_codec_param_is_none test/test.py::AudioSegmentTests::test_fade_raises_exception_when_duration_is_negative test/test.py::AudioSegmentTests::test_fade_raises_exception_when_duration_start_end_are_none test/test.py::AudioSegmentTests::test_fades test/test.py::AudioSegmentTests::test_for_accidental_shortening test/test.py::AudioSegmentTests::test_formats test/test.py::AudioSegmentTests::test_from_mono_audiosegments test/test.py::AudioSegmentTests::test_get_dc_offset test/test.py::AudioSegmentTests::test_indexing test/test.py::AudioSegmentTests::test_invert test/test.py::AudioSegmentTests::test_make_chunks test/test.py::AudioSegmentTests::test_max_dBFS test/test.py::AudioSegmentTests::test_mp3_with_jpg_cover_img test/test.py::AudioSegmentTests::test_mp3_with_png_cover_img test/test.py::AudioSegmentTests::test_normalize test/test.py::AudioSegmentTests::test_overlay test/test.py::AudioSegmentTests::test_overlay_times test/test.py::AudioSegmentTests::test_overlay_with_gain_change test/test.py::AudioSegmentTests::test_pan test/test.py::AudioSegmentTests::test_remove_dc_offset test/test.py::AudioSegmentTests::test_repeat_with_multiply test/test.py::AudioSegmentTests::test_reverse test/test.py::AudioSegmentTests::test_sample_array test/test.py::AudioSegmentTests::test_set_channels test/test.py::AudioSegmentTests::test_silent test/test.py::AudioSegmentTests::test_slicing test/test.py::AudioSegmentTests::test_speedup test/test.py::AudioSegmentTests::test_split_to_mono test/test.py::AudioSegmentTests::test_sum test/test.py::AudioSegmentTests::test_volume_with_add_sub test/test.py::AudioSegmentTests::test_zero_length_segment test/test.py::SilenceTests::test_detect_completely_silent_segment test/test.py::SilenceTests::test_detect_silence_seg1 test/test.py::SilenceTests::test_detect_tight_silent_segment test/test.py::SilenceTests::test_detect_too_long_silence test/test.py::SilenceTests::test_realistic_audio test/test.py::GeneratorTests::test_duration test/test.py::GeneratorTests::test_loudness test/test.py::GeneratorTests::test_with_smoke test/test.py::NoConverterTests::test_exporting test/test.py::NoConverterTests::test_init_AudioSegment_data_buffer test/test.py::NoConverterTests::test_init_AudioSegment_data_buffer_with_bad_values_fails test/test.py::NoConverterTests::test_init_AudioSegment_data_buffer_with_missing_args_fails test/test.py::NoConverterTests::test_opening_mp3_file_fails test/test.py::NoConverterTests::test_opening_raw_file test/test.py::NoConverterTests::test_opening_raw_file_with_missing_args_fails test/test.py::NoConverterTests::test_opening_wav24_file test/test.py::NoConverterTests::test_opening_wav_file test/test.py::FilterTests::test_highpass_filter_cutoff_frequency test/test.py::FilterTests::test_highpass_filter_reduces_loudness test/test.py::FilterTests::test_highpass_works_on_multichannel_segments test/test.py::FilterTests::test_lowpass_filter_cutoff_frequency test/test.py::FilterTests::test_lowpass_filter_reduces_loudness
setup.py pydub/playback.py CHANGELOG.md pydub/audio_segment.py
setup.py pydub/playback.py CHANGELOG.md pydub/audio_segment.py