2014-01-13 5 views
0

mp4 관련 문제가 있습니다. 나는 비디오 프로세싱에 관련된 것들이별로 좋지 않다. 라이브 스트림에서 HTTP 라이브 스트리밍 (HLS)을 통해 기록 된 이미지 파일에 문제가 있습니다. HLS 청크는 모아서 파일 시스템에 .mp4 파일로 저장됩니다. 이 파일은 Apple QuickTime에서 재생할 수 없습니다. VLC에서 재생할 수 있습니다. 그러나 QuickTime으로 재생할 수 있어야합니다.Quicktime이 기록 된 mp4 비디오 파일을 재생할 수 없습니다.

그러나 해결책을 찾았습니다. ffmpeg 명령 -reset_timestamps를 사용하면 QuickTime으로 비디오 파일을 재생할 수 있습니다. 또한 어떤 매개 변수가 변경되는지 확인할 수 있습니다. 그것은 시작 값입니다. 명령을 사용하기 전에

:

ffmpeg -i recorded_file.mp4 

ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers 
    built on Jan 9 2014 09:06:57 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid 
    libavutil  52. 18.100/52. 18.100 
    libavcodec  54. 92.100/54. 92.100 
    libavformat 54. 63.104/54. 63.104 
    libavdevice 54. 3.103/54. 3.103 
    libavfilter  3. 42.103/3. 42.103 
    libswscale  2. 2.100/2. 2.100 
    libswresample 0. 17.102/0. 17.102 
    libpostproc 52. 2.100/52. 2.100 
[h264 @ 0x7fcb7b015a00] non-existing SPS 2 referenced in buffering period 
[h264 @ 0x7fcb7b015a00] non-existing PPS referenced 
[h264 @ 0x7fcb7b015a00] non-existing SPS 2 referenced in buffering period 
[h264 @ 0x7fcb7b015a00] non-existing PPS 0 referenced 
[h264 @ 0x7fcb7b015a00] decode_slice_header error 
[h264 @ 0x7fcb7b015a00] no frame! 
[mpegts @ 0x7fcb7b004a00] max_analyze_duration 5000000 reached at 5013333 microseconds 
[mpegts @ 0x7fcb7b004a00] Could not find codec parameters for stream 2 (Unknown: none ([21][0][0][0]/0x0015)): unknown codec 
Consider increasing the value for the 'analyzeduration' and 'probesize' options 
[NULL @ 0x7fcb7b016a00] start time is not set in estimate_timings_from_pts 
Input #0, mpegts, from 'recorded_file.mp4': 
    Duration: 00:25:00.01, start: 68428.580933, bitrate: 1499 kb/s 
    Program 1 
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0]/0x001B), yuv420p, 1024x576 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x101]: Audio: aac ([15][0][0][0]/0x000F), 48000 Hz, stereo, fltp, 124 kb/s 
    Stream #0:2[0x102]: Unknown: none ([21][0][0][0]/0x0015) 

명령의 사용 : 명령의 사용 후

ffmpeg -i recorded_file.mp4 output.mp4 -reset_timestamps 0 

파일 :

ffmpeg -i output.mp4 

ffmpeg version 1.2.4 Copyright (c) 2000-2013 the FFmpeg developers 
    built on Jan 9 2014 09:06:57 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
    configuration: --prefix=/usr/local/Cellar/ffmpeg/1.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid 
    libavutil  52. 18.100/52. 18.100 
    libavcodec  54. 92.100/54. 92.100 
    libavformat 54. 63.104/54. 63.104 
    libavdevice 54. 3.103/54. 3.103 
    libavfilter  3. 42.103/3. 42.103 
    libswscale  2. 2.100/2. 2.100 
    libswresample 0. 17.102/0. 17.102 
    libpostproc 52. 2.100/52. 2.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    encoder   : Lavf54.63.104 
    Duration: 00:25:00.04, start: 0.021333, bitrate: 1358 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p, 1024x576 [SAR 1:1 DAR 16:9], 1224 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc 
    Metadata: 
     handler_name : VideoHandler 
    Stream #0:1(und): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, fltp, 127 kb/s 
    Metadata: 
     handler_name : SoundHandler 

텍스트 출력 변화의 많은 시작 값이 거의 0으로 설정되어 있기 때문에 duration, start 및 bitrate가있는 행은 흥미 롭습니다.

Duration: 00:25:00.04, start: 0.021333, bitrate: 1358 kb/s 

그래서이 솔루션을 사용하면 충분합니다. 문제는 파일을 다운로드하는 솔루션에서 ffmpeg를 사용할 수 없다는 것입니다 (Android 용). 그래서 나는 자바에서 이것을 할 방법을 찾으려고 노력한다. 그러나 비디오 프로세싱에 많은 경험이 없기 때문에이 ffmpeg 명령이하는 일을 이해할 수 없으므로 Java 솔루션을 찾을 방향을 모릅니다.

Java에서 동일한 작업을 수행 할 수있는 라이브러리가 있습니까 (예 : 파일 타임 스탬프 조정과 같은) Java에서 직접 할 수있는 라이브러리가 있습니까?

도움 주셔서 감사합니다.

EDIT : 일부 콘솔 대신 전체 콘솔 출력이 표시됩니다.

+0

귀하는 FFmpeg 인코딩 명령의 전체 콘솔 출력을 포함해야한다. – LordNeckbeard

답변

0

나는 해결책을 직접 발견했다. 문제는 타임 스탬프가 잘못되었지만 입력 파일이 컨테이너가없는 MPEG-TS 스트림이라는 것입니다. 컨테이너가 .mp4로 끝나기 때문에 파일 확장자가 잘못되어 Qucktime에서 재생할 수 없습니다. ffmpeg 명령을 실행하면 스트림이 자동으로 .mp4 컨테이너로 래핑되었습니다. 나중에 파일 형식이 정확했기 때문에 Quicktime에서 재생할 수있었습니다. 입력 파일의 이름을 .ts (MPEG-TS 스트림) 파일 확장자로 변경 한 후 Quicktime은 입력 파일도 재생할 수 있습니다.

사실, -reset_timestamps로 문제를 해결 한 나의 명령은 타임 스탬프가 문제라는 잘못된 가정을하게했습니다.

0

FFFFEG로 변환 된 MP4가 QuickTime에서 재생되도록 수정되었습니다. 매개 변수에 -pix_fmt yuv420p이 추가되었습니다.

당신은 퀵타임 및 대부분의 다른 플레이어에서 작동하도록 출력 -pix_fmt yuv420p을 사용해야합니다 바보 플레이어

에 대한 https://trac.ffmpeg.org/wiki/Encode/H.264#FAQ:

인코딩에서 발견. 이 플레이어는 H.264 비디오에 대해 4 : 2 : 0 크로마 하위 샘플링을 사용하는 YUV 평면 색상 공간 만 지원합니다. 그렇지 않으면 소스에 따라 ffmpeg가 이러한 플레이어와 호환되지 않는 픽셀 형식으로 출력 될 수 있습니다.

관심이 있다면, 여기 내가 사용하는 전체 FFMPEG 명령입니다 :

ffmpeg -i $1 \ 
    -acodec libfaac -b:a 96k \ 
    -vcodec libx264 -b:v 1.5M \ 
    -pix_fmt yuv420p \ 
    -threads 0 -s $2 $destination/$filename.mp4 
+0

해결책 주셔서 감사합니다. 나는 이미 문제의 실제 원인을 발견했다고 생각한다. (위의 나의 대답을 보라). – Dude

관련 문제