H264 비디오 스트림을 다시 인코딩하지 않고 ffmpeg로 .MTS 파일 (AVCHD)을 .mp4로 변환하려면 어떻게해야합니까?


20

참고 : 나는 이 공동체를 아직 찾지 못했던 짧은 시간 전에 동일한 질문을 stackoverflow에 게시했습니다 . 질문이이 커뮤니티에 더 적합하기 때문에 이것을 다시 게시합니다.

1. 내가 시도한 것

좀이 .MTS (AVCHD 형식) 내 AVCHD 카메라로 recoreded 파일을 . 사양은 다음과 같습니다.

$ ffprobe 140612_Canon-00000.MTS 
ffprobe version 2.2.1 Copyright (c) 2007-2014 the FFmpeg developers
(snip)
Input #0, mpegts, from '140612_Canon-00000.MTS':
  Duration: 00:48:58.40, start: 0.800300, bitrate: 5563 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), 
      yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 
      29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 
      stereo, fltp, 256 kb/s

프레임 속도 / 타임베이스 부분에주의 : 29.97fps, 29.97tbr, 90k tbn, 59.94tbc

이제 H264 비디오 스트림을 다시 인코딩하지 않고 오디오 스트림을 AAC코드 변환 하여이 파일을 .mp4 파일로 변환 하고 싶습니다 . 그래서 다음 명령을 시도했습니다.

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

2. 결과

출력 파일의 사양은 다음과 같습니다.

$ ffprobe 140612_Canon-00000.MTS.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.33.100

  Duration: 00:01:00.04, start: 0.021333, bitrate: 4590 kb/s

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
        1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
        59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 
        48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

프레임 속도 / 타임베이스 부분을 살펴보십시오 : 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc . ffmpeg가 방금 비디오 스트림을 복사했지만 프레임 속도와 타임베이스가 두 번 value로 변경되었습니다 .

따라서 QuickTime Player 또는 VLC Player로 출력 파일을 열고 재생할 때 오디오에는 문제가 없지만 비디오 스트림이 올바르게 재생되지 않습니다. 프레임을 앞뒤로 떨림 반복적으로 반복하여 비디오를 재생합니다.

3. 질문

  1. H264 비디오 스트림을 올바르게 다시 인코딩하지 않고 ffmpeg로 .MTS 파일 (AVCHD)을 .mp4로 변환하려면 어떻게 해야 합니까?
  2. 어떻게 수있는 원래의 프레임 속도 / 타임베이스 값을 유지 (FPS / TBR / TBN / TBC) I는 컨테이너를 변환 할 때 ffmpeg-vcodec copy스위치를.
  3. 비디오 스트림을 다시 인코딩하지 않고 ffmpeg의 명령 줄 옵션으로 프레임 속도 / 타임베이스 값 (fps / tbr / tbn / tbc)을 설정 하는 방법

어떤 아이디어?


4. -r 29.97옵션 추가

스파클 스 교수는 추가 할 조언을했다 -r 29.97. 나는 그것을 시도했다 :

ffmpeg -i 140612_Canon-00001.MTS -t 60 -r 29.97 -y -vcodec copy -acodec libfaac -ab 128k 140612_Canon-00001.MTS.mp4

그러나 출력 파일에 여전히 잘못된 프레임 속도 / 타임베이스가 있습니다.

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
1440x1080 [SAR 4:3 DAR 16:9], 4448 kb/s, 
59.94 fps, 59.94 tbr, 11988 tbn, 59.94 tbc (default)

5. MP4Box를 이용한 Remux

Sparkles 교수의 조언에 따르면 MP4Box를 사용하여 demux와 remux를 시도했습니다.

brew install mp4box

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vcodec copy -an 140612_Canon-00000.MTS.h264

ffmpeg -i 140612_Canon-00000.MTS -t 60 -y \
  -vn -acodec libfaac -ab 128k 140612_Canon-00000.MTS.aac

mp4box -add 140612_Canon-00000.MTS.h264:fps=29.97 \
  -add 140612_Canon-00000.MTS.aac \
  -new 140612_Canon-00000.MTS.mp4

출력은 다음과 같습니다.

ffprobe 140612_Canon-00000.MTS.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '140612_Canon-00000.MTS.mp4':
(snip)
  Duration: 00:02:00.22, start: 0.000000, bitrate: 2293 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), 
          yuv420p, 1440x1080 [SAR 4:3 DAR 16:9], 2228 kb/s, 
          29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      creation_time   : 2014-07-14 00:38:23
      handler_name    : 140612_Canon-00000.MTS.h264:fps=29.97
       - Imported with GPAC 0.5.0-rev4065

    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, 
          stereo, fltp, 125 kb/s (default)

조금 앞으로 나아 보입니다. 프레임 속도 / 타임베이스 부분을 살펴보십시오 : 29.97fps, 29.97tbr, 30k tbn, 59.94tbc . (컨테이너의 타임베이스 값)을 제외하고tbn 원래 스트림과 일치합니다 .

그러나 Quicktime Player 또는 VLC로 출력 파일을 재생 하면 비디오가 절반 속도로 재생됩니다 .

원본 파일은 90k tbn(90000 틱 / 초) MP4Box의 새로운 출력 파일 30k tbn은 원본 파일의 3 분의 1에 불과하지만 출력 파일은 절반 속도로 재생됩니다.

이유를 모르겠습니다. 그러나 나머지 문제는 tbn값을 조정할 수있는 방법이라고 생각합니다 .


5-b. 출력 파일에 대한 MediaInfo의 보고서

또한 MP4Box를 사용하여 5. Remux에서 생성 된 출력 파일에서 MediaInfo 도구사용해 보았습니다 . 출력은 다음과 같습니다. https://gist.github.com/kaorukobo/c5ab9eaa413dff6cd26a


6. avconv 시도

Volodya는 avconv효과가 있다고보고했다 . 또한 동일한 카메라로 녹화 된 짧은 샘플 동영상 파일 (Canon-00006.MTS)을 준비했습니다. 좋아, 시도해 보자.

brew install avconv
avconv -i Canon-00006.MTS -c:a copy -c:v copy -y Canon-00006.MTS.mp4
ffprobe Canon-00006.MTS.mp4

출력 파일의 ffprobe 정보는 여기 ( https://gist.github.com/kaorukobo/5b53244ade2632ff1211) 이며 프레임 속도 / 시간축 정보는 다음과 같습니다. 59.94 fps, 59.94 tbr, 90k tbn, 59.94 tbc

Volodya가보고 한 바와 같이 출력 파일은 VLC Player잘 재생 되었습니다. 그러나 Quicktime Player X로 비디오를 열면 비디오가 정상 속도로 재생되었지만 프레임이 뒤로 떨림 반복적으로 재생되었습니다.


7. "Free AVCHD to MOV"앱이 작동하는 이유는 무엇입니까?

마찬가지로 나는 내 이전의 코멘트에 언급 , MOV의 무료 AVCHD 응용 프로그램의 "재 포장 MOV에" 기능은 MP4하지만, MOV를하지하게하더라도 잘 작동.

소프트웨어는 내부적으로 자체 ffmpeg (또는 avconv) 프로그램을 호출하며 어떤 옵션이 전달되는지 확인했습니다. 다음과 같습니다.

/Applications/Free AVCHD to Mov.app/Contents/Resources/bin/com.geranium-soft.convert \
  -i /path/to/140710_Canon-00003.MTS \
  -map 0:0 -map 0:1 -c:a libfaac -vol 256 -b:a 128k -c:v copy \
  -sn -movflags faststart -threads 0 -pix_fmt yuv420p -y \
  /path/to/140710_Canon-00003.mov

-t 60ffmpeg 프로그램으로 변환하고 동일한 옵션 (매우 동일. 출력 컨테이너 유형을 MOV로 설정하고 스위치 조차 제거 했습니다)을 전달하려고했습니다 . 그러나 결과는 지금까지보고 된 것과 동일 합니다.

어쨌든 훌륭한 응용 프로그램은 ".mp4"및 "ffmpeg"로를 제외하고 "H264 비디오 스트림을 다시 인코딩하지 않고 .MTS 파일 (AVCHD)을 .mp4로 변환하는 방법"에 관한 문제를 해결했습니다. 그러나 나는 여전히 그 앱이 잘 작동하지만 ffmpeg가 그렇지 않은 이유에 관심이 있습니다.


"정확하게"는 무슨 뜻입니까? 제목에서 제거 할 수도 있습니다. 나는 돕고 싶지만 ffmpeg를 사용한 적이 없다. 난 그냥 어도비 도구 미디어 인코더를 사용합니다.
eLouai

@eLouai 좋아요, 제목을 수정했습니다.
kaorukobo

답변:


8

귀하의 질문 텍스트에서 다른 유틸리티에 대해 논의하기 시작했다는 것을 알았으므로 ffmpeg를 고수하는 것이 아니라 작업을 수행하는 데 관심이 있다고 가정합니다.

libav 및 MTS에 대한 나의 경험에서 나는 프레임 속도에 문제가 없었으며 파일은 완벽하게 리 뮤싱됩니다.

내 파일 중 하나를 사용하여 다음을 시도했습니다.

avconv -i 00174.MTS -c:a copy -c:v copy 00174.mp4

결과 MP4 파일은 VLC에서 올바르게 재생되었습니다.

내 파일은 프로그레시브 MTS이며, 인터레이스가 없지만 필요하다면 더 확인 할 수 있습니다.

파일 테스트에 대한 보고서

토픽 스타터는 MTS에서 MP4로 리 멕싱 된 파일을 제공 할 수 있었고 QuickTime Player (버전을 알 수 없음)를 사용하여 해당 사용자의 머신에서 재생되지 않았습니다. 그러나 그것은 그 개인의 VLC 플레이어와 놀았습니다.

Mac OS 컴퓨터는 없지만 Ubuntu로 시도했습니다. VLC (2.0.8) 및 그놈 비디오 (Totem이라고 함) (3.8.2)의 Ubuntu에서 재생했습니다. 둘 다 완벽하게 연주합니다.

그런 다음 Mac에있는 친구에게 재생을 요청했습니다. 그는 Mavericks (10.9.4)에 있으며 QuickTime Player 10.3 (727.4)에서 잘 플레이했습니다.

현재 특정 플레이어 나 컴퓨터의 구성 설정에 문제가있는 것 같습니다. 그리고 아마도 현재 버전을 먼저 제거하고 이전 구성을 완전히 지우면 최신 버전의 QTP로 업데이트하는 것이 가장 좋습니다.

또 다른 가능성

오래된 컴퓨터를 가지고 있었을 때 일부 플레이어에서 일부 높은 비트 전송률 파일이 잘못 재생되었으며 컨테이너마다 다릅니다. 예를 들어, VLC는 MTS 파일 재생을 거부하고 프레임을 표시 한 다음 다음 파일을 1 초 반만 표시합니다. 그놈 비디오는 잘 재생되었습니다. 그러나 MKV로 리 멕싱 할 때 두 선수 모두 합리적으로 잘 연주했습니다. 이것은 아마도 비슷한 질문입니다. 플레이어는 충분한 CPU 시간 만 필요로하는 특정 컨테이너 (이 경우 MP4)를 읽고 스스로 질식하기 시작합니다. 그 결과, 하위 프로세스가 CPU 마무리를 차지하고 불량 하위 프로세스가 다시 시작되고주기가 계속 진행된 후 플레이어가 매우 빠르게 뒤쳐지는 모든 프레임을 덤프하는 것이 원인입니다.

이 가능성에서 가장 좋은 방법은 여전히 ​​소프트웨어 업그레이드를 시도하는 것입니다. 현재 멀티 코어 프로세서를 사용하면 실제로 하드웨어를 얻지 않고 하드웨어를 업그레이드해야 할 필요성을 테스트하기 어려울 수 있지만 QuickTime Player를 사용하는 동안 CPU로드를 확인하여 VLC와 비교할 수 있습니다. QTP가있는 하나의 코어에 대해 100 %가 표시되면이를 나타냅니다.


avconv가 그를 위해 다른 일을 할 것 같지는 않습니다. avconv는 ffmpeg의 포크이며 ffmpeg는 avconv 프로젝트의 많은 커밋을 ffmpeg로 병합하고 있으며, 주요 버그 수정은 ffmpeg에있을 수 있습니다.
PTS

@ProfessorSparkles 나는 그것이 그것이 효과가 있다는 사실이 다른 것을 믿기에 충분한 근거라고 생각합니다. 가오루 코보의 말을 기다리겠습니다.
v010dya

@Volodya 귀하의 정보에 감사드립니다. avconv를 시도하는 보고서를 내 질문에 추가했습니다.
kaorukobo

@kaorukobo "프레임이 뒤로 떨림 반복적으로 반복된다"는 것은 무슨 뜻입니까? 출력이 흔들 리거나 어떤 식 으로든 앞뒤로 점프합니까?
v010dya

@Volodya 당신의 표현이 옳다고 생각합니다. 보는 것은 믿는 것입니다. 결과 Canon-00006.MTS.mp4를 filedropper.com/canon-00006mts에 업로드했습니다. 마음에 들지 않으면 VLC가 아닌 QuickTime Player (Mac의 경우 ...)를 사용하여 해당 파일을 재생 해보십시오.
kaorukobo

5

이 ffmpeg 버그에 따라

인터레이스 H.264 패킷이 분할되어 MP4 STTS가 발생 함

인터레이스 된 H.264를 포함하는 mpeg-ts를 mp4로 리 먹싱 할 때, 각 비디오 프레임의 두 필드는 분리 된 패킷으로 분할된다. Mediainfo와 같은 소프트웨어는 STTS를 사용하여 프레임 속도를 결정합니다. 25fps 대신 50fps로 표시됩니다

여기에보고 된 프레임 속도 불일치는 사양에 따라 ffmpeg muxing 인터레이스 MP4 스트림의 결과 인 것으로 보이며, 각 필드는 하나의 패킷으로 분리됩니다. 따라서

"MP4 파일의 샘플 수를 사용하여 프레임 속도를 결정하는 소프트웨어는 단순히 잘못된 것입니다." 댓글 7

필드 쌍을 하나의 액세스 장치에 병합하면 MPEG-4 사양을 위반하므로 동일한 인코더를 사용하므로 패치되지 않습니다.

참고 이러한 아래와 같은 : 다중 출력은 것을 재생 다음 팟 플레이어와 VLC에서 나를 위해 벌금을.

    ffmpeg version N-76741-g8eadabf Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)

Input #0, mpegts, from '00007.MTS':
  Duration: 00:00:07.01, start: 1.033367, bitrate: 15935 kb/s
  Program 1 
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 448 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
[mp4 @ 054cf020] Codec for stream 0 does not use global headers but container format requires global headers
Output #0, mp4, to '00007.MTS.mp4':
  Metadata:
    encoder         : Lavf57.16.100
    Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 90k tbc
    Stream #0:1: Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, 5.1(side), fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.15.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (ac3 (native) -> aac (native))
Press [q] to stop, [?] for help
[mp4 @ 054cf020] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[mp4 @ 054cf020] pts has no value
    Last message repeated 209 times
frame=  420 fps=0.0 q=-1.0 Lsize=   12478kB time=00:00:07.01 bitrate=14564.2kbits/s    
video:12458kB audio:6kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.111239%
[aac @ 052fd480] Qavg: 64863.176

4

을 사용하여 원래 프레임 속도를 적용하려고 할 수 있습니다 -r 29.97. FFmpeg는 아마도 어떤 이유로 프레임 속도를 조정하려고합니다. 그렇지 않으면 구문이 정확하므로 해당 오류가 발생하지 않아야합니다.

세번째 질문에 대해서 단순히 불가능합니다. 프레임을 개별적으로 인코딩하는 코덱을 사용할 때 프레임을 생략 할 수 있지만 h264의 경우에는 해당되지 않지만 이러한 코덱을 사용하더라도 여전히 어떤 방식으로 비디오 스트림을 수정해야합니다. 프레임 속도를 높이는 것도 마찬가지입니다. 계산 된 프레임을 추가하거나 일부 프레임을 복제해야합니다.

편집 : 아래 의견의 추가 정보와 관련하여. 완전히 새로운 파일을 작성하지 않고 형식 헤더에 기록 된 데이터를 변경해야하는 경우 16 진 편집기에서 수행 할 수 있습니다. FFmpeg에는 스트림 데이터를 포함하지 않는 메타 데이터를 변경하는 옵션 만 있습니다. 파일의 변경 방법 및 위치는 컨테이너 형식에 따라 다릅니다.

다른 옵션은 컨테이너를 디 먹싱하고 옵션이 지정된 비디오 및 오디오 스트림을 새 컨테이너로 리 뮤싱하는 것입니다. 다시 지정할 수있는 양은 컨테이너 형식에 따라 다릅니다. 이 경우 MP4Box 도구 가 도움이 될 수 있습니다. 다음 구문을 사용하여 원시 비디오 스트림을 새 mp4로 muxing 할 때 프레임 속도를 지정할 수 있습니다.

MP4Box -add input.h264:fps=29.97 -new output.mp4

감사. -t 60스위치 와 관련 하여 프레임 속도가 아니라 처리 시간 ( $ ffmpeg -h|grep -- -t-> -t duration record or transcode "duration" seconds of audio/video) 을 지정하는 옵션입니다.
kaorukobo

아 맞습니다. 다른 인코더였습니다. 해당 오류로 죄송합니다.
PTS

답변에 대한 편집 내용을 참조하십시오.
PTS

다시 감사합니다. 조언을 시도하여 결과를 추가하기 위해 질문을 편집했습니다. 불행히도, 문제는 여전히 ..
kaorukobo

세 번째 질문에 대한 귀하의 답변과 관련하여 "값"뿐만 아니라 비디오 스트림의 프레임 속도를 변경하고 싶습니다. 그러나 필자의 경우 "set framerate/timebase values"컨테이너 / 코덱 스트림의 헤더에 넣은 값을 다시 쓰는 것을 의미합니다. 왜? 일부 인코더 (예 : Apple Compressor의 h264 트랜스 코더)가 비디오 스트림에 잘못된 타임베이스 값 (tbc)을 주입하는 경우와 ffmpeg가 잘못된 프레임 속도 / 타임베이스 값을 주입하는이 질문과 같은 경우 원본 비디오 파일과 다릅니다.
kaorukobo

2

나는 이것이 오래된 질문이라는 것을 알고 있지만 피드에서 다시 팝업되어 나에게 새로운 것입니다. (-:

내가 언급하지 않은 한 가지는 필드 순서입니다. 이 파일은 인터레이스 파일이므로 고려해야합니다. OP는 틀린 필드 순서를 나타내는 플래그 인 "뒤로 떨리는"프레임을 언급합니다. 'quivering'을 제외하고 비디오가 다른 경우에는 ffmpeg가 "top field first"를 강제로 적용하는 데 필요한 것을 추가하십시오. 나는 ffmpeg 세부 사항에 익숙하지 않아 정확한 플래그를 제공합니다.


귀하의 답변에 ffmepg 명령을 실행하려고합니다. 그러나 내 ffmpeg 버전 2.2.1에는 필드 순서를 처리하는 옵션이없는 것 같습니다. 시도 ffmpeg -h|egrep 'field|first'했지만 아무것도 표시되지 않습니다. ffmpeg의 이전 버전 (0.8.6)에는 -top이를 처리 할 수있는 옵션이 있었습니다 .
kaorukobo

@kaorukobo 인터넷은 다음을 제공합니다. -vf "fieldorder = bff" 또는 = tff 여기서 tb 는 각각 위와 아래를 나타냅니다. 최고 = 1 / 0 옵션은 분명히 필드가 작성되지 읽을되는 순서를 변경하는 데 사용됩니다. 다시 한 번, ffmpeg / avconv를 부담없이 사용하므로 보장 할 수 없습니다.
Jim Mack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.