Vas*_*ras 5 video vlc-media-player recording ffmpeg vhs
我正在尝试使用 USB 视频捕获设备和以下命令录制我的旧 VHS 磁带:
ffmpeg -f alsa -ac 2 -i default -f v4l2 -standard pal -i /dev/video0 -c:v libx264 -qp 0 -preset fast -strict -2 zzz.mp4
Run Code Online (Sandbox Code Playgroud)
但有时,在录制过程中出乎意料地,ffmpeg 会冻结视频录制并保留在最后一帧(音频继续录制)。错误消息类似于:
[video4linux2,v4l2 @ 0x23e51a0] Dequeued v4l2 buffer contains 414720 bytes, but 829440 were expected. Flags: 0x00002005.
/dev/video0: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)
我在互联网上找到了关于这方面的几乎零信息。我在这里发现了描述为功能请求的问题:https : //trac.ffmpeg.org/ticket/4795
另外,我在出现此错误之前的警告消息时遇到了一些麻烦,这似乎没有关系,也似乎不影响视频录制,但我也想知道它是什么意思:
[video4linux2,v4l2 @ 0x23e51a0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[alsa @ 0x23cc360] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
Run Code Online (Sandbox Code Playgroud)
使用反复试验,当我设置-f v4l2 -thread_queue_size 32
和时,警告似乎消失了
-f alsa -thread_queue_size 2048
。我不知道为什么。当我将视频输入的线程队列大小提高到 512 时,我没有警告,但我丢了帧。
我希望我可以使用 ffmpeg 进行录音。VLC录制没有问题,但是我参数也有问题,我还没有研究够。如果有人可以建议 vlc 的替代命令来记录无损,我将切换到 vlc ...
ffmpeg 的完整输出是:
$ ffmpeg -f alsa -ac 2 -i default -f v4l2 -standard pal -i /dev/video0 -c:v libx264 -qp 0 -preset fast -strict -2 zzz.mp4
ffmpeg version 2.7.6-0ubuntu0.15.10.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.2.1 (Ubuntu 5.2.1-22ubuntu2) 20151010
configuration: --prefix=/usr --extra-version=0ubuntu0.15.10.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --enable-shared --disable-stripping --enable-avresample --enable-avisynth --enable-frei0r --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-openal --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libxvid --enable-libzvbi --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-libssh --enable-libsoxr --enable-libx264 --enable-libopencv --enable-libx265
libavutil 54. 27.100 / 54. 27.100
libavcodec 56. 41.100 / 56. 41.100
libavformat 56. 36.100 / 56. 36.100
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 16.101 / 5. 16.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.100 / 1. 2.100
libpostproc 53. 3.100 / 53. 3.100
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, alsa, from 'default':
Duration: N/A, start: 1457422230.571465, bitrate: 1536 kb/s
Stream #0:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Input #1, video4linux2,v4l2, from '/dev/video0':
Duration: N/A, start: 4454.267377, bitrate: 165888 kb/s
Stream #1:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 720x576, 165888 kb/s, 25 fps, 25 tbr, 1000k tbn, 1000k tbc
File 'zzz.mp4' already exists. Overwrite ? [y/N] y
No pixel format specified, yuv422p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 0x231cd00] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 LZCNT
[libx264 @ 0x231cd00] profile High 4:4:4 Predictive, level 3.0, 4:2:2 8-bit
[libx264 @ 0x231cd00] 264 - core 146 r2555 0c21480 - 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=0x1:0x111 me=hex subme=6 psy=0 mixed_ref=1 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to 'zzz.mp4':
Metadata:
encoder : Lavf56.36.100
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv422p, 720x576, q=-1--1, 25 fps, 12800 tbn, 25 tbc
Metadata:
encoder : Lavc56.41.100 libx264
Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc56.41.100 aac
Stream mapping:
Stream #1:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Stream #0:0 -> #0:1 (pcm_s16le (native) -> aac (native))
Press [q] to stop, [?] for help
[video4linux2,v4l2 @ 0x231a180] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[alsa @ 0x2301360] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[video4linux2,v4l2 @ 0x231a180] Dequeued v4l2 buffer contains 414720 bytes, but 829440 were expected. Flags: 0x00002005.
/dev/video0: Invalid data found when processing input
frame= 1962 fps= 17 q=-1.0 Lsize= 409086kB time=00:01:53.53 bitrate=29516.7kbits/s
video:407234kB audio:1777kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.018333%
[libx264 @ 0x231cd00] frame I:346 Avg QP: 0.00 size:186290
[libx264 @ 0x231cd00] frame P:1616 Avg QP: 0.00 size:218162
[libx264 @ 0x231cd00] mb I I16..4: 92.3% 0.0% 7.7%
[libx264 @ 0x231cd00] mb P I16..4: 76.1% 0.0% 22.8% P16..4: 0.2% 0.5% 0.4% 0.0% 0.0% skip: 0.0%
[libx264 @ 0x231cd00] 8x8 transform intra:0.0% inter:76.8%
[libx264 @ 0x231cd00] coded y,uvDC,uvAC intra: 100.0% 100.0% 100.0% inter: 100.0% 100.0% 100.0%
[libx264 @ 0x231cd00] i16 v,h,dc,p: 0% 100% 0% 0%
[libx264 @ 0x231cd00] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 78% 3% 1% 2% 3% 1% 3% 1%
[libx264 @ 0x231cd00] i8c dc,h,v,p: 1% 98% 0% 0%
[libx264 @ 0x231cd00] Weighted P-Frames: Y:31.7% UV:20.6%
[libx264 @ 0x231cd00] ref P L0: 52.8% 47.2%
[libx264 @ 0x231cd00] kb/s:42508.35
Run Code Online (Sandbox Code Playgroud)
小智 6
这在 FFmpeg v4.3 中由https://github.com/FFmpeg/FFmpeg/commit/b761ae072a169eb183abe0785a258b9787e267d3解决,这使此错误成为警告,并且似乎跳过了帧。
v4.3 于 6 月 15 日发布。
我找不到任何解决这个 ffmpeg 问题的方法,最近我发现这篇文章说:
\n\n\n\n\n看起来,stk1160 设备将这些损坏的帧发送到 v4l2 设备,一旦它们到达 ffmpeg,它就会阻塞并报告无效帧。尽管这是 ffmpeg 的 \xe2\x80\x9chonest\xe2\x80\x9d 质量的一部分,但我认为这是一个错误,因为它退出转码过程\n 并使 ffmpeg 不适合手头的任务。
\n
因此,我开始使用 mencoder。\n这个博客帮助我开始使用 mencoder:http://easycap.blogspot.com/p/command-line-tv.html
\n\n我使用http://www.mplayerhq.hu给出的源代码编译了 MPlayer(其中包含 mencoder)
\n