#4513 closed defect (duplicate)
Avfoundation Audio stutters / sounds broken with screen capture
Reported by: | kevin | Owned by: | |
---|---|---|---|
Priority: | normal | Component: | avdevice |
Version: | git-master | Keywords: | avfoundation |
Cc: | florent.thiery@ubicast.eu, t-ffmpeg@snowelm.com | Blocked By: | |
Blocking: | Reproduced by developer: | no | |
Analyzed by developer: | no |
Description
Summary of the bug:
I am trying to do a basic screen capture in OS X [10.10.3] with audio from
mic using avfoundation.
The recorded audio is stuttering, breaks, or there is short bursts.
How to reproduce:
ffmpeg -f avfoundation -i "1:0" -r 25 -c:v libx264 -preset fast -crf 22 -c:a libfdk_aac -b:a 128k -ar 44100 -s 640x480 screen.mp4 ffmpeg version: git-master and also version N-71716-g7b94a2f built on ... OS X 10.10.3
I tried different codec, bitrate, and audio is broken in all.
While the same exact command with -i "0:0" for FaceTime camera has great audio quality.
Here is link to the recorded file in which audio is broken:
play on web: https://www.dropbox.com/s/p7ej68mrhi2te8r/screen.mp4?dl=0
downloadable link: https://www.dropbox.com/s/p7ej68mrhi2te8r/screen.mp4?dl=1
ffmpeg -f avfoundation -i "1:0" -r 25 -c:v libx264 -preset fast -crf 22 -c:a libfdk_aac -b:a 128k -ar 44100 -s 640x480 screen.mp4 ffmpeg version 2.6.1 Copyright (c) 2000-2015 the FFmpeg developers built with Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) configuration: --prefix=/usr/local/Cellar/ffmpeg/2.6.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libfaac --enable-libass --enable-ffplay --enable-libfdk-aac --enable-openssl --enable-libopus --enable-libquvi --enable-libx265 --enable-nonfree --enable-vda libavutil 54. 20.100 / 54. 20.100 libavcodec 56. 26.100 / 56. 26.100 libavformat 56. 25.101 / 56. 25.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 11.102 / 5. 11.102 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 3.100 / 53. 3.100 [avfoundation @ 0x7f9b89001400] Selected pixel format (yuv420p) is not supported by the input device. [avfoundation @ 0x7f9b89001400] Supported pixel formats: [avfoundation @ 0x7f9b89001400] uyvy422 [avfoundation @ 0x7f9b89001400] yuyv422 [avfoundation @ 0x7f9b89001400] nv12 [avfoundation @ 0x7f9b89001400] 0rgb [avfoundation @ 0x7f9b89001400] bgr0 [avfoundation @ 0x7f9b89001400] Overriding selected pixel format to use uyvy422 instead. [avfoundation @ 0x7f9b89001400] Stream #0: not enough frames to estimate rate; consider increasing probesize Input #0, avfoundation, from '1:0': Duration: N/A, start: 0.368389, bitrate: N/A Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 1440x900, 1000k tbr, 1000k tbn, 1000k tbc Stream #0:1: Audio: pcm_f32le, 44100 Hz, stereo, flt, 2822 kb/s No pixel format specified, yuv422p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players. [libx264 @ 0x7f9b89103200] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64 [libx264 @ 0x7f9b89103200] profile High 4:2:2, level 3.0, 4:2:2 8-bit [libx264 @ 0x7f9b89103200] 264 - core 144 r2533 c8a773e - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=1 ref=2 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=6 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=30 rc=crf mbtree=1 crf=22.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to 'screen.mp4': Metadata: encoder : Lavf56.25.101 Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 640x480, q=-1--1, 25 fps, 12800 tbn, 25 tbc Metadata: encoder : Lavc56.26.100 libx264 Stream #0:1: Audio: aac (libfdk_aac) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, s16, 128 kb/s Metadata: encoder : Lavc56.26.100 libfdk_aac Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264)) Stream #0:1 -> #0:1 (pcm_f32le (native) -> aac (libfdk_aac)) Press [q] to stop, [?] for help frame= 255 fps= 25 q=-1.0 Lsize= 286kB time=00:00:10.19 bitrate= 229.8kbits/s dup=102 drop=0 video:137kB audio:136kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.737433% [libx264 @ 0x7f9b89103200] frame I:2 Avg QP:20.52 size: 46726 [libx264 @ 0x7f9b89103200] frame P:65 Avg QP:23.32 size: 640 [libx264 @ 0x7f9b89103200] frame B:188 Avg QP:31.27 size: 22 [libx264 @ 0x7f9b89103200] consecutive B-frames: 1.6% 0.0% 1.2% 97.3% [libx264 @ 0x7f9b89103200] mb I I16..4: 15.7% 48.2% 36.1% [libx264 @ 0x7f9b89103200] mb P I16..4: 0.0% 0.0% 0.4% P16..4: 0.8% 0.1% 0.0% 0.0% 0.0% skip:98.7% [libx264 @ 0x7f9b89103200] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.2% 0.0% 0.0% direct: 0.0% skip:99.8% L0:38.8% L1:61.2% BI: 0.0% [libx264 @ 0x7f9b89103200] 8x8 transform intra:43.0% inter:2.5% [libx264 @ 0x7f9b89103200] coded y,uvDC,uvAC intra: 37.2% 37.7% 33.9% inter: 0.0% 0.1% 0.0% [libx264 @ 0x7f9b89103200] i16 v,h,dc,p: 60% 40% 0% 0% [libx264 @ 0x7f9b89103200] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 87% 8% 3% 0% 0% 0% 0% 0% 1% [libx264 @ 0x7f9b89103200] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 39% 12% 3% 3% 3% 6% 3% 8% [libx264 @ 0x7f9b89103200] i8c dc,h,v,p: 74% 11% 14% 1% [libx264 @ 0x7f9b89103200] Weighted P-Frames: Y:0.0% UV:0.0% [libx264 @ 0x7f9b89103200] ref P L0: 73.8% 26.2% [libx264 @ 0x7f9b89103200] ref B L0: 95.1% 4.9% [libx264 @ 0x7f9b89103200] ref B L1: 95.1% 4.9% [libx264 @ 0x7f9b89103200] kb/s:109.18
Attachments (3)
Change History (37)
by , 10 years ago
Attachment: | screen.mp4 added |
---|
comment:1 by , 10 years ago
Component: | avdevice → undetermined |
---|
comment:2 by , 10 years ago
Mailing list discussion of this problem:
https://ffmpeg.org/pipermail/ffmpeg-user/2015-April/026160.html
comment:3 by , 10 years ago
Keywords: | audio removed |
---|---|
Priority: | important → normal |
comment:4 by , 9 years ago
There is a patch that might help with the audio issues while screen capturing that can be found in ticket #4437.
Please test that patch.
comment:6 by , 9 years ago
Cc: | added |
---|
comment:8 by , 9 years ago
An alternative patch also fixing this issue is currently in review on ffmpeg-devel:
http://thread.gmane.org/gmane.comp.video.ffmpeg.devel/203959/focus=203966
comment:9 by , 9 years ago
Hello,
For information, our issue was fixed by the patch provided in #4437 but not by the larger overhaul that you mention.
comment:10 by , 9 years ago
How do I apply this 3 part patch? When I get this in the console:
"fatal: patch with only garbage at line 9"
comment:11 by , 9 years ago
Thanks for the feedback!
The overhaul patch is going to be void soon since we're currently trying to get a common codebase with Libav. This will unfortunately postpone a real update on this device for some time.
However, thanks to your feedback, I will reevaluate again the corresponding tickets for the avfoundation device.
Thanks!
@LordHDL: sounds like a copy&paste issue. Either retry to download the patches again or clone from: https://github.com/thiloborgmann/FFmpeg.git
And checkout branch avf2.
follow-up: 13 comment:12 by , 8 years ago
Can someone please confirm is this bug still exists? I facing the same problem, audio stutters while capturing screen and saving mp4 file using h264 and aac.
comment:13 by , 8 years ago
comment:14 by , 7 years ago
Confirmed still broken in the latest git HEAD.
Also confirmed that the patch https://ffmpeg.org/pipermail/ffmpeg-devel/2015-August/177845.html fixes the issue for me when applied to the commit it was as generated for, although I had to increase the hardcoded QUEUE_SIZE from 4 to 400.
However the two-year-old patch does not apply cleanly to HEAD.
comment:15 by , 7 years ago
I thought I had tested the patch applies to current FFmpeg git head, could you elaborate?
comment:16 by , 7 years ago
Console log:
NJCMBP15:~/soft/FFmpeg.current nickc Thu Jan 25 17:42:28 $ git checkout HEAD Your branch is up-to-date with 'origin/master'. NJCMBP15:~/soft/FFmpeg.current nickc Thu Jan 25 17:43:37 $ git pull Already up-to-date. NJCMBP15:~/soft/FFmpeg.current nickc Thu Jan 25 17:43:44 $ git apply -v ~/Downloads/avf.patch Checking patch libavdevice/avfoundation.m... error: while searching for: CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, YES); } lock_frames(ctx); ctx->video_stream_index = stream->index; avpriv_set_pts_info(stream, 64, 1, avf_time_base); image_buffer = CMSampleBufferGetImageBuffer(ctx->current_frame); image_buffer_size = CVImageBufferGetEncodedSize(image_buffer); stream->codec->codec_id = AV_CODEC_ID_RAWVIDEO; error: patch failed: libavdevice/avfoundation.m:551 error: libavdevice/avfoundation.m: patch does not apply NJCMBP15:~/soft/FFmpeg.current nickc Thu Jan 25 17:46:51 $ git remote show origin * remote origin Fetch URL: https://github.com/FFmpeg/FFmpeg.git Push URL: https://github.com/FFmpeg/FFmpeg.git HEAD branch: master Remote branches: master tracked oldabi tracked release/0.10 tracked release/0.11 tracked release/0.5 tracked release/0.6 tracked release/0.7 tracked release/0.8 tracked release/0.9 tracked release/1.0 tracked release/1.1 tracked release/1.2 tracked release/2.0 tracked release/2.1 tracked release/2.2 tracked release/2.3 tracked release/2.4 tracked release/2.5 tracked release/2.6 tracked release/2.7 tracked release/2.8 tracked release/3.0 tracked release/3.1 tracked release/3.2 tracked release/3.3 tracked release/3.4 tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
comment:18 by , 7 years ago
Does the patch still fix the issue?
Sorry, I had tested with patch
which defaults to a less strict mode.
comment:19 by , 7 years ago
@nickcrabtreeis is correct, applying the avf.patch and a queue size of 400 resolves the issue. 4 seems too small and fails
Thanks @nickcrabtreeis!
comment:20 by , 6 years ago
This issue still seems to persist, and the avf.patch
file seems to resolve it (with a queue size of 400). Is there anyway this can make it into a release? I'd rather not support a custom build with this patch if possible.
comment:21 by , 6 years ago
Can confirm that applying the patch against current master (4b7166c9d5) and increasing QUEUE_SIZE to 400 fixes this issue for me.
comment:22 by , 6 years ago
Hey guys, still having the issue with latest ffmpeg version. Is there any plan to fix it or to apply the patch in ffmpeg's codebase?
comment:23 by , 6 years ago
Another vote for adding the patch to the main release. I no longer have a compiling environment for what I need so I can't make use of it. Attempts to patch and compile afterward just fail.
comment:24 by , 6 years ago
Would someone be willing to help me compile it with the patch? I'd be super grateful. I've been trying but didn't manage to do it because the patch doesn't apply cleanly anymore
by , 6 years ago
Attachment: | 0001-lavd-avfoundation-uses-a-queue-to-buffer-audio-and-v.patch added |
---|
Patch from mailing list applied on top of 78e1d7f42110aec8d4cd703a7939c64b5a191952
by , 6 years ago
Attachment: | 0002-lavd-avfoundation-Increase-QUEUE_SIZE-to-400.patch added |
---|
Increase QUEUE_SIZE to 400. Applied on top of previous patch.
comment:25 by , 6 years ago
I've attached the patch from the mailing list rebased on the current master (78e1d7f42110aec8d4cd703a7939c64b5a191952) and an additional patch which increases the QUEUE_SIZE to 400. I can confirm it successfully builds although I haven't tested it again since I last posted. I'll post the commit message from that second patch here as it is relevant for this discussion:
By increasing the QUEUE_SIZE the chance of frames dropping out of the buffer is significantly reduced. It's been noted in trac #4513 by nickcrabtree that the current size of 4 is too low for most (any?) applications. 400 is ultimately an arbitrary-but-tested number.
I've noticed that even with QUEUE_SIZE set to 400 I can still run into a situation where it's not high enough as evidence by the log output. However this is always in instances where my system is consistently encoding at a rate slower than frames are being pulled from AVFoundation so the buffer overrun is inevitable unless the duration left to encode is short. So it's hard to put the blame on this code when the problem can be alleviated by changing a runtime configuration elsewhere.
Given the above limitation it seems clear that increasing QUEUE_SIZE is not a magic fix but gives the encoder more wiggle room to temporarily lag behind frames pulled in from AVFoundation. If you do see "video queue is full, the oldest frame has been dropped" in your log then increasing QUEUE_SIZE further may work in some instances but fixing the underlying issue would require an increase in encoder speed or a frame-rate reduction on the AVFoundation end.
One last note is that while I use the term encoder here (as that's likely to be the slowest part of your pipeline) I am really referring to anything downstream of AVFoundation's input.
comment:27 by , 5 years ago
Cc: | added |
---|
Is anybody working for merging these patches into the master? They are really important if we want to encode 4k video on MacOS.
comment:28 by , 5 years ago
If you want the patch applied, please test it and send it to the FFmpeg development mailing list.
follow-up: 34 comment:29 by , 5 years ago
Version: | git-master → 4.2 |
---|
This is still broken on 4.2.2 and the patch from #4437 fixes the issue but doesn't apply on top of 4.2.2 anymore.
comment:30 by , 5 years ago
Component: | undetermined → avdevice |
---|---|
Version: | 4.2 → git-master |
comment:31 by , 5 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
comment:32 by , 5 years ago
I see the ticket closed as duplicate, but I don't see a reference to the duplicated issues.
comment:34 by , 4 years ago
Replying to Correa:
This is still broken on 4.2.2 and the patch from #4437 fixes the issue but doesn't apply on top of 4.2.2 anymore.
do you know what the last version where this patch applied and ffmpeg was able to compile? i think at least adding a version number where this patch is applicable so people running macos who would like to do screen recording using both the screen and mic at the same time without audio issues would be beneficial. i'd much prefer to use ffmpeg for this rather than having the latest and greatest if this patch can not be applied as this issue still lingers in the latest version of ffmpeg installed via brew.
and just putting a version number here or a branch that people can check to apply this patch and get some basic A/V screen recording going would make for a decent point of reference.
The screen captured video file with broken audio