I am using ffmpeg 2.8 on OSX.
I try to convert a short mp4 video to webm for adaptive streaming like suggested here http://wiki.webmproject.org/adaptive-streaming/instructions-to-playback-adaptive-webm-using-dash like this:
VP9_DASH_PARAMS="-tile-columns 6 -frame-parallel 1"
ffmpeg -i t2.mp4 -c:v libvpx-vp9 -s 160x90 -b:v 250k -keyint_min 150 -g 150 ${VP9_DASH_PARAMS} -an -f webm -dash 1 video_160x90_250k.webm
ffmpeg -i t2.mp4 -c:a libvorbis -b:a 128k -vn -f webm -dash 1 audio_128k.webm
ffmpeg \
-f webm_dash_manifest -i video_160x90_250k.webm \
-f webm_dash_manifest -i audio_128k.webm \
-c copy -map 0 -map 1 \
-f webm_dash_manifest \
-adaptation_sets "id=0,streams=0 id=1,streams=1" \
manifest.mpd
However this gives me a warning unspecified pixel format:
[webm_dash_manifest # 0x7f9414812800] Could not find codec parameters for stream 0 (Video: vp9, none, 160x90): unspecified pixel format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
video_160x90_250k.webm: could not find codec parameters
Input #0, webm_dash_manifest, from 'video_160x90_250k.webm':
Metadata:
encoder : Lavf56.36.100
Duration: 00:00:09.97, bitrate: 111 kb/s
Stream #0:0: Video: vp9, none, 160x90, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
Metadata:
webm_dash_manifest_duration: 9969
webm_dash_manifest_initialization_range: 437
webm_dash_manifest_file_name: video_160x90_250k.webm
webm_dash_manifest_track_number: 1
webm_dash_manifest_cues_start: 139297
webm_dash_manifest_cues_end: 139399
webm_dash_manifest_bandwidth: 99164
webm_dash_manifest_cluster_keyframe: 1
webm_dash_manifest_cue_timestamps: 0,2085,4171,6256,8342
Input #1, webm_dash_manifest, from 'audio_128k.webm':
Metadata:
encoder : Lavf56.36.100
Duration: 00:00:10.01, bitrate: 120 kb/s
Stream #1:0: Audio: vorbis, 48000 Hz, stereo, fltp (default)
Metadata:
webm_dash_manifest_duration: 10009
webm_dash_manifest_initialization_range: 4697
webm_dash_manifest_file_name: audio_128k.webm
webm_dash_manifest_track_number: 1
webm_dash_manifest_cues_start: 151174
webm_dash_manifest_cues_end: 151240
webm_dash_manifest_bandwidth: 105517
webm_dash_manifest_cluster_keyframe: 1
webm_dash_manifest_cue_timestamps: 0,4999,9998
Output #0, webm_dash_manifest, to 'manifest.mpd':
Metadata:
encoder : Lavf56.36.100
Stream #0:0: Video: vp9, none, 160x90 [SAR 1:1 DAR 16:9], q=2-31, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
Metadata:
webm_dash_manifest_duration: 9969
webm_dash_manifest_initialization_range: 437
webm_dash_manifest_file_name: video_160x90_250k.webm
webm_dash_manifest_track_number: 1
webm_dash_manifest_cues_start: 139297
webm_dash_manifest_cues_end: 139399
webm_dash_manifest_bandwidth: 99164
webm_dash_manifest_cluster_keyframe: 1
webm_dash_manifest_cue_timestamps: 0,2085,4171,6256,8342
Stream #0:1: Video: vorbis, none, q=2-31, 1k tbn, 1k tbc (default)
Metadata:
webm_dash_manifest_duration: 10009
webm_dash_manifest_initialization_range: 4697
webm_dash_manifest_file_name: audio_128k.webm
webm_dash_manifest_track_number: 1
webm_dash_manifest_cues_start: 151174
webm_dash_manifest_cues_end: 151240
webm_dash_manifest_bandwidth: 105517
webm_dash_manifest_cluster_keyframe: 1
webm_dash_manifest_cue_timestamps: 0,4999,9998
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 Lsize= 1kB time=00:00:00.00 bitrate=N/A
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)
Nevertheless the manifest file is created. I tried to specify the pixel format:
-pix_fmt yuv420p
However this did not change anything. The warning remains the same.
Any ideas why the warning appears and how to fix this?
The problem seems to be that ffmpeg fails to decode a few frames to get the pixel format when using webm_dash_manifest with the VP9 codec. It works without issues for VP8.
This happens in the avformat_find_stream_info function:
ret = read_frame_internal(ic, &pkt1);
if (ret == AVERROR(EAGAIN))
continue;
if (ret < 0) {
/* EOF or error*/
break;
}
read_frame_internal() returns garbage and prevents the code to reach the try_decode_frame() part.
When using VP8 it retrieves the parameters directly from the codec context:
// Try to just open decoders, in case this is enough to get parameters.
if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
if (codec && !st->codec->codec)
if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
av_log(ic, AV_LOG_WARNING,
"Failed to open codec in av_find_stream_info\n");
}
st->codec-pix_fmt is 0 for VP8 and -1 (not found) for VP9. If it's supposed to get the parameters directly from the context then maybe there's an issue with libvpx-vp9.
It works when using ffprobe directly with the webm file:
ffprobe -i video_160x90_250k.webm
Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv), 160x90, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 1k tbc (default)
The issue doesn't seem to affect the manifest creation so I guess you can ignore the warnings.
I'm not yet sufficiently familiar with ffmpeg to propose a patch, so it may be best to report it as a bug on the ffmpeg tracker: http://ffmpeg.org/pipermail/ffmpeg-user/2015-September/028610.html
Related
With FFmpeg the mov directly into yuv, then yuv encoded into H264 and encapsulated into ts, ts video found less than the length of time the length of the mov video time. I want to know how to modify the FFmpeg command to solve the video time length shorter problem
The ffmpeg command is as follows:
ffmpeg-i 00.mov 01.yuv
ffmpeg-s 1920x800-pix_fmt yuv420p-i 01.yuv-vcodec libx264-x264-params fps=24 02.h264.
ffmpeg-i 02.h264 03.ts
Use ffprobe to view the 00.mov details are as follows:
Duration: 00: 12: 14.17, start: 0.000000, bitrate: 6361 kb/s
Stream #0:0 (eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1920x800 [SAR 1: 1 DAR 12: 5], 6162 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
Metadata:
handler_name: VideoHandler
encoder: libx264
Stream # 0:1 (eng): Audio: mp3 (. mp3 / 0x33706D2E), 44100 Hz, stereo, fltp, 191 kb/s (default)
Metadata:
handler_name: SoundHandler
Use ffprobe to view the 03.ts details are as follows:
Duration: 00:11:44.80, start: 1.440000, bitrate: 2242 kb/s
Program 1
Metadata:
service_name: Service01
service_provider: FFmpeg
Stream #0:0 [0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p (tv, progressive), 1920x800 [SAR 1:1 DAR 12: 5], 25 fps, 25 tbr, 90k tbn, 50 tbc
How to modify the ffmpeg command to make the ts video duration equal to the duration of the mov video
In the 2nd command, add -framerate 24 for the input. The x264 fps signaling only affects ratecontrol and not any framerate metadata in the raw .264 output.
Also, add -c copy in the 3rd comand to avoid re-encoding.
Could you help me to find my mistake. I am trying to concatenate two files (webm) which have transparent background. I do the following:
ffmpeg -i 1.webm -i 2.webm -filter_complex "[0:v:0] 1:v:0]concat=n=2:v=1[outv]" -map "[outv]" 3.webm
I get the concatenate video as i I expect. However the transparent background disappears. Instead the background is black. How to keep the transparency when i concatenate two videos?
The output of the above command is:
ffmpeg version 3.3.4-2 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 7 (Ubuntu 7.2.0-8ubuntu2)
Input #0, matroska,webm, from '1.webm':
Metadata:
encoder : Lavf57.71.100
Duration: 00:00:04.35, start: 0.000000, bitrate: 293 kb/s
Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, progressive), 799x770, SAR 1:1 DAR 799:770, 23 fps, 23 tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode : 1
Input #1, matroska,webm, from '2.webm':
Metadata:
encoder : Lavf57.71.100
Duration: 00:00:04.35, start: 0.000000, bitrate: 303 kb/s
Stream #1:0(eng): Video: vp9 (Profile 0), yuv420p(tv, progressive), 799x770, SAR 1:1 DAR 799:770, 23 fps, 23 tbr, 1k tbn, 1k tbc (default)
Metadata:
alpha_mode : 1
File '3.webm' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 (vp9) -> concat:in0:v0
Stream #1:0 (vp9) -> concat:in1:v0
concat -> Stream #0:0 (libvpx-vp9)
Press [q] to stop, [?] for help
[libvpx-vp9 # 0x55f58406a540] v1.6.1
Output #0, webm, to '3.webm':
Metadata:
encoder : Lavf57.71.100
Stream #0:0: Video: vp9 (libvpx-vp9), yuv420p, 799x770 [SAR 1:1 DAR 799:770], q=-1--1, 200 kb/s, 23 fps, 1k tbn, 23 tbc (default)
Metadata:
encoder : Lavc57.89.100 libvpx-vp9
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame= 200 fps=8.4 q=0.0 Lsize= 187kB time=00:00:08.65 bitrate= 176.8kbits/s speed=0.365x
video:185kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.011632%
`
I thought this had been fixed, but apparently the native VPx decoders still don't decode alpha, so you have to use the libvpx decoders.
ffmpeg -c:v libvpx-vp9 -i 1.webm -c:v libvpx-vp9 -i 2.webm -filter_complex "[0:v:0] 1:v:0]concat=n=2:v=1[outv]" -map "[outv]" 3.webm
I have a sliding video overlay on top of a background screen and move it from point a to point b.
The resulting video produces choppy movement. The overlay moves a step at a time instead of in one continous motion.
Here's an example of the code:
ffmpeg -y -stream_loop -1 -i b.mpg -i bg.jpg -filter_complex "
[0:v]scale=320:240[vid];[1][vid]overlay=x='(180+(30-180)*(t-
0)/60)*between(t,0,60)+(30+(290-30)*(t-60)/60)*between(t,60,120)':y='(120+
(120-120)*(t-0)/60)*between(t,0,60)+(120+(30-120)*(t-
60)/60)*between(t,60,120)'[out]" -map "[out]" -r 29.97 -aspect 4:3 -b:v
4000k -minrate 4000k -maxrate 4000k -bufsize 2000k -t 64 t.mpg
Input #0, mpegvideo, from 'b.mpg':
Duration: 00:00:32.34, bitrate: 4000 kb/s
Stream #0:0: Video: mpeg2video (Main), yuv420p(tv, progressive), 720x480
[SAR 32:27 DAR 16:9], 4000 kb/s, 29.97 fps, 29.97 tbr, 1200k tbn, 59.94 tbc
Input #1, image2, from 'bg.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 19637 kb/s
Stream #1:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 640x480,
25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 (mpeg2video) -> scale
Stream #1:0 (mjpeg) -> overlay:main
overlay -> Stream #0:0 (mpeg1video)
Press [q] to stop, [?] for help
[swscaler # 0000000002adc740] deprecated pixel format used, make sure you
did set range correctly
Output #0, mpeg, to 't.mpg':
Metadata:
encoder : Lavf57.73.100
Stream #0:0: Video: mpeg1video, yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=2-31,
4000 kb/s, 29.97 fps, 90k tbn, 29.97 tbc (default)
Metadata:
encoder : Lavc57.99.100 mpeg1video
Side data:
cpb: bitrate max/min/avg: 4000000/4000000/4000000 buffer size: 2000000
vbv_delay: -1
warning, clipping 1 dct coefficients to -255..255repeated 2 timesnter
Link to video here: https://youtu.be/EE_hrjy4ilg
Am converting a DVD extraction from an MKV container to an MPEG2 file. This is the command I am using:
ffmpeg -i title04.mkv -c:v copy -c:a copy title04.m2v
It creates the file but with no audio. Am not sure what I am missing as it isn't throwing any error (and usually if a stream isn't compatible with a container it complains).
Here is the output. Any ideas?
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, matroska,webm, from 'title04.mkv':
Metadata:
encoder : libmakemkv v1.8.12 (1.3.0/1.4.1) darwin(x86-release)
creation_time : 2014-08-28 19:36:24
Duration: 00:00:11.34, start: 0.000000, bitrate: 4979 kb/s
Stream #0:0(eng): Video: mpeg2video (Main), yuv420p(tv), 720x480 [SAR 8:9 DAR 4:3], max. 7500 kb/s, 29.97 fps, 29.97 tbr, 1k tbn, 59.94 tbc
Stream #0:1(eng): Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s (default)
Metadata:
title : Stereo
Stream #0:2(eng): Subtitle: dvd_subtitle, 720x480 (default)
Output #0, mpeg2video, to 'title04.m2v':
Metadata:
encoder : Lavf55.48.100
Stream #0:0(eng): Video: mpeg2video, yuv420p, 720x480 [SAR 8:9 DAR 4:3], q=2-31, max. 7500 kb/s, 29.97 fps, 29.97 tbn, 29.97 tbc
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame= 340 fps=0.0 q=-1.0 Lsize= 4738kB time=00:00:11.31 bitrate=3431.4kbits/s
video:4738kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
m2v (mpeg 2 video) is a video only container. The audio stream is not included.
You should use .mpg or .mpeg as container format.
FFMPEG OUTPUT
COMMAND
/usr/local/bin/ffmpeg -i '/home/machine/public_html/video_1355531272.m4v' -s '640x480' -sameq -ab '64k' -ar '44100' -f 'flv' -pass '1' -passlogfile '/home/machine/public_html/tmp/1355531273-50cbc4090d696-multipass' -y /home/machine/public_html/tmp/1355531273-50cbc4090d2a9.flv &> /home/machine/public_html/tmp/1355531273-50cbc4090da7c.info
/usr/local/bin/ffmpeg -i '/home/machine/public_html/video_1355531272.m4v' -s '640x480' -sameq -ab '64k' -ar '44100' -f 'flv' -pass '2' -passlogfile '/home/machine/public_html/tmp/1355531273-50cbc4090d696-multipass' -y /home/machine/public_html/tmp/1355531273-50cbc4090d2a9.flv &> /home/machine/public_html/tmp/1355531273-50cbc4090da7c.info
eng): Video: h264, yuv420p, 960x540, 3428 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 5994 tbc
Metadata:
creation_time : 2012-12-14 22:50:55
Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 111 kb/s
Metadata:
creation_time : 2012-12-14 22:50:55
[buffer # 0xdd079d0] w:960 h:540 pixfmt:yuv420p
[scale # 0xdd07da0] w:960 h:540 fmt:yuv420p -> w:640 h:480 fmt:yuv420p flags:0xa0000004
[flv # 0xdd041c0] requested bitrate is too low
Output #0, flv, to '/home/machine/public_html/tmp/1355531273-50cbc4090d2a9.flv':
Stream #0.0(eng): Video: flv, yuv420p, 640x480, q=2-31, pass 2, 200 kb/s, 90k tbn, 29.97 tbc
Metadata:
creation_time : 2012-12-14 22:50:55
Stream #0.1(eng): Audio: adpcm_swf, 44100 Hz, stereo, s16, 64 kb/s
Metadata:
creation_time : 2012-12-14 22:50:55
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height
-------------------------------
RESULT
-------------------------------
Execute error. Output for file "/home/machine/public_html/video_1355531272.m4v" was found, but the file contained no data. Please check the available codecs compiled with FFmpeg can support this type of conversion. You can check the encode decode availability by inspecting the output array from PHPVideoToolkit::getFFmpegInfo().
Remove the -sameq option. It does not mean same quality.